Jump to content

View more

View more

Image of the Day

雑魚は多めにして、爽快感重視にしつつ・・・(´・ω・`)
早いとこ、ベースを作って、完成にもっていかないとね。
タイトルもまだ迷ってるだよなぁ。 
#indiedev  #indiegame #screenshotsaturday https://t.co/IwVbswGrhe
IOTD | Top Screenshots

The latest, straight to your Inbox.

Subscribe to GameDev.net Direct to receive the latest updates and exclusive content.


Sign up now

How to get a correct TBN matrix and TBN quaternion?

4: Adsense

Old topic!

Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.


  • You cannot reply to this topic
4 replies to this topic

#1 diolee   Members   

100
Like
0Likes
Like

Posted 04 April 2012 - 04:03 AM

Hi,

For saving the bandwidth of video memory, my project decided to use a quaternion to store a TBN.

Now I get a tangent, bi-tangent and a normal vectors. for converting them to a quaternion, I use a 3x3 matrix that the Rows i, j, k of the matrix stored t, b, n. for sure I have already been to normalized the t,b,n and did the Schimdt orthonormal.

Then, I transformed the matrix to a quaternion. In order to test the quaternion, I transformed the quaternion back to matrix. unfortunately, the values of these vectors were all wrong.

I doubted the 3x3 Matrix which I built was not correct, or something else. I'm not sure.

Who knows how to deal with this?

Regards,
Dio

#2 Ashaman73   Members   

13714
Like
0Likes
Like

Posted 04 April 2012 - 04:49 AM

I'm doing the same and it works. First off, you should accept some error tolerance, then try to detect the error by starting with simple values (unit matrix etc.).

Btw. one pitfall of using quaternion instead of matrixes is, that an automatically generated TBN could change the handness, but you can't really map this to a quaternion (atleast I didn't know how to). I encoded the handness of the resulting matrix in the quaternion/position (i.e. a negativ homogenous coord for flipped handness).

Ashaman

 

Gnoblins: Website - Facebook - Twitter - Youtube - Steam Greenlit - IndieDB - Gamedev Log


#3 diolee   Members   

100
Like
0Likes
Like

Posted 04 April 2012 - 05:24 AM

I'm doing the same and it works. First off, you should accept some error tolerance, then try to detect the error by starting with simple values (unit matrix etc.).

Btw. one pitfall of using quaternion instead of matrixes is, that an automatically generated TBN could change the handness, but you can't really map this to a quaternion (atleast I didn't know how to). I encoded the handness of the resulting matrix in the quaternion/position (i.e. a negativ homogenous coord for flipped handness).


Hi Ashaman73,

Thanks for your advice. the handness I already handled in a same way just like you.

Is the way I build the TBN matrix right? My result is much more than error tolerance. I mean if the tangent, bitangnet and normal is (1,0,0) ,(0,1,0), (0,0,1).
So whether the 3x3 matrix should be like :
(1,0,0)
(0,1,0)
(0,0,1)?

And Is the matrix_to_quat() method any different with the regular algorithm?

#4 Ashaman73   Members   

13714
Like
0Likes
Like

Posted 04 April 2012 - 05:45 AM

For the unit matrix, what is the resulting quaternion ? Can you post some code of the conversation between matrix->quat & quat -> matrix ?

Ashaman

 

Gnoblins: Website - Facebook - Twitter - Youtube - Steam Greenlit - IndieDB - Gamedev Log


#5 diolee   Members   

100
Like
0Likes
Like

Posted 04 April 2012 - 08:01 AM



For the unit matrix, what is the resulting quaternion ? Can you post some code of the conversation between matrix->quat & quat -> matrix ?


I tried the unit matrix, that is fine.

Here is the codes:
Orthonormlize(vert->tangent, vert->binormal, vert->normal );
Matrix33f tSpaceMat = Matrix33f::GetIdentity();
tSpaceMat.SetAxisI( Vec3f(vert->tangent.x, vert->tangent.y, vert->tangent.z) );
tSpaceMat.SetAxisJ( Vec3f(vert->binormal.x, vert->binormal.y, vert->binormal.z) );
tSpaceMat.SetAxisK( Vec3f(vert->normal.x, vert->normal.y, vert->normal.x) );
Quaternion4f quat;
quat.FromMatrix( tSpaceMat );
Matrix33f tMat;
quat.ToMatrix( tMat );





Old topic!

Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.