View and/or Projection matrix causing geometry to warp or tear apart when moving camera?

Started by
0 comments, last by VladR 10 years, 12 months ago

I've been experiencing issues with my rendered geometry, it seems that when I move the camera around, stuff gets squished/warped, sometimes meshes even twist out of existence, I also get strange behaviors when I rotate stuff.Here is a wireframe example:
8427c22755030b0e.png

At first glance, the spheres renders ok, however when I try to move the camera behind it, as I near it's side, it gets deformed like this:
3785fb19b99a55c3.png

Also for instance when I make scenes object to be children of a parent and I rotate that parent, it only works if I rotate for only one axis.If I try more axes, they either start to move in a weird wave-like trajectory or teaer apart out of existence.I must note that the tearing apart happens only if I distance the camera away from them, but they don't come back when I take the camera back closer.Here's the source to my transformations:

The basic Entity class has these members:

(matrices are initialized to XMMatrixIdentity() at constructor)


                XMVECTOR translation;
                XMMATRIX rotation;
                XMVECTOR scale;
                XMMATRIX worldTransform;
                XMMATRIX localTransform;
 

And each frame they are updated with respect to the entity's parent transforms:


                XMMATRIX matrixTranslation = XMMatrixTranslationFromVector(translation);
                XMMATRIX matrixScaling = XMMatrixScalingFromVector(scale);
                
                localTransform = matrixScaling * rotation * matrixTranslation;

if(parentEntity != nullptr)
            worldTransform = localTransform * parentEntity->GetWorldTransform(); //GetWorldTransform() returns a XMMATRIX
 

This rotates the entities:


//I keep a XMVECTOR axis and a float speed, delta is a float that is basically game time passed
                    XMMATRIX matrixRotation = XMMatrixRotationAxis(axis, delta * speed);

                    XMMATRIX matrixEntityRotation = entity->Rotation(); //Rotation() returns a XMMATRIX
                    
                    matrixEntityRotation = matrixEntityRotation * matrixRotation;

                    XMVECTOR m0 = matrixEntityRotation.r[0];
                    XMVECTOR m1 = matrixEntityRotation.r[1];
                    XMVECTOR m2 = matrixEntityRotation.r[2];

                    XMVECTOR q0 = m0 / XMVector3Length(m0);
                    XMVECTOR q1 = (m1-(XMVector3Dot(q0, m1) * q0)/XMVector3Length(m1 - XMVector3Dot(q0, m1) * q0));
                    XMVECTOR q2 = (m2 -(XMVector3Dot(q0, m2) * q0-XMVector3Dot(q1, m2) * q1)  /XMVector3Length(m2 - XMVector3Dot(q0, m2) * q0-(XMVector3Dot(q1, m2) * q1)));

                    matrixEntityRotation.r[0] = q0;
                    matrixEntityRotation.r[1] = q1;
                    matrixEntityRotation.r[2] = q2;

                    entity->SetRotation(matrixEntityRotation);
 

The rotation algorithm is pretty much taken from the Wild Magic library, which I learned about from MVP Jason Zink's matrix classes.

The projection matrix I'm 100% sure is not the issue, since it's just a simple:


projectionMatrix = XMMatrixPerspectiveFovLH(fieldOfView, aspectRatio, nearZ, farZ);
 

where the values are:
fieldOfView = 1/4th of Pi;
aspectRatio = width(800)/height(600);
nearZ = 0.1f;

farZ = 1000.0f;

The view matrix I think might be the true issue here, the camera is based on an Entity, so camera movement is like an Entity moving around and the view matrix is generated from the entity's facing direction:


            XMVECTOR vectorEye;
            XMVECTOR vectorAt;
            XMVECTOR vectorUp;

            //not at all certain these are correct:
            vectorEye = worldTransform.r[3];
            vectorAt = worldTransform.r[3] + worldTransform.r[2];
            vectorUp = worldTransform.r[1];

            //this is the view matrix
            XMMATRIX ViewMatrix = XMMatrixLookAtLH(vectorEye, vectorAt, vectorUp); //this sometimes crashes, as calls XMMatrixLookToLH, which has some assertions in it and since it does a vector division, prior to submitting the arguments to XMMatrixLookToLH, it's really hard to always make sure I'm passing values that would satisfy the assertions *sigh*
 

After I pass them to the vertex shader, it's just 2 mul calls from there:


    float4x4 WorldViewProjectionMatrix = mul(WorldMatrix, mul(ViewMatrix, ProjectionMatrix));
    output.position = mul(float4(input.position, 1.0f), WorldViewProjectionMatrix);
 

Transposing or not transposing the world matrix before submitting it to the shader changes the orientation, but it doesn't fix the squishing/warping/disintegrating issues with the geometry.Actualy, most of the times when I create multiple spheres, they all get stuck in the same position, so you can't really tell they're multiple spheres and they move apart when I tild the camera.Am I using the algorithms improperly?


>removed<

Advertisement

I don't feel like going through that much code atm, but similar stuff happens when your Look/Up/Right vector aren't perpendicular.

I'd extract those vectors from the view matrix and check if they really are perpendicular to each other, first.

VladR My 3rd person action RPG on GreenLight: http://steamcommunity.com/sharedfiles/filedetails/?id=92951596

This topic is closed to new replies.

Advertisement