yezu666

Members
  • Content count

    5
  • Joined

  • Last visited

Community Reputation

100 Neutral

About yezu666

  • Rank
    Newbie
  1. Direction Vector to Rotation Matrix

    [quote name='gsamour' timestamp='1305901794' post='4813475'] vector3 tempUp = [0, 1, 0] vector3 right = forward.cross(tempUp) vector3 up = right.cross(forward) matrix3x3 rotationMat = [ right.x forward.x up.x ] [ right.y forward.y up.y ] [ right.z forward.z up.z ] [/quote] Thanks for the suggestion. I've tried this method but I don't seem to get a correct transformation from it. I'll keep trying, though
  2. Direction Vector to Rotation Matrix

    [quote name='haegarr' timestamp='1305903601' post='4813485'] That code snippet is probably wrong: It negates the x component of the local forward vector variable, sets the y component to 0 and afterwards negates it, and does nothing with the z component. However, the method is ... abstruse. Why do you suppress the y component first and later consider it by rotation? [/quote] Well Indeed I made a typo. The part: [code]forward.setY(-forward.getY());[/code]is not needed. (Fixed it BTW ) I remove the Y component, because the upper method didn't provide proper rotation for it. So effectively I've split the operation into two rotations and then I multiply the resulting matrices. The method is not very straight forward but provides correct results. I'd gladly change it I if could find something simpler that calculates correctly. Although I haven't noticed so far, I think there are errors in my LookAt function. AFAIK the resulting matrix should be orthonormal and the scaling effect after transposition suggests it is not. I must look into it. However I would be very happy if You could help me. Here is the code: [code] public static TransformationMatrix calculateLookAtMatrix(Vector3d eye, Vector3d center, Vector3d up) { float [] matrix = new float[16]; Vector3d forward = Vector3d.sub(center , eye); forward.normalize(); Vector3d side = Vector3d.cross(forward , up); side.normalize(); Vector3d plane_up = Vector3d.cross(side , forward); plane_up.normalize(); matrix[0] = side.getX(); matrix[1] = plane_up.getX(); matrix[2] = -forward.getX(); matrix[3] = 0.0f; matrix[4] = side.getY(); matrix[5] = plane_up.getY(); matrix[6] = -forward.getY(); matrix[7] = 0.0f; matrix[8] = side.getZ(); matrix[9] = plane_up.getZ(); matrix[10] = -forward.getZ(); matrix[11] = 0.0f; matrix[12] = 0.0f; matrix[13] = 0.0f; matrix[14] = 0.0f; matrix[15] = 1.0f; Vector3d neweye = new Vector3d(eye); neweye.reverse(); TransformationMatrix ret = new TransformationMatrix(matrix); ret.multiply(TransformationMatrix.calculateTranslationMatrix(neweye)); return ret; } [/code] thanks a lot for the help
  3. Direction Vector to Rotation Matrix

    Ok. Solved. Sort of I've managed to implement a function using hybrid method. It seems to work. However is not very elegant. For anyone interested: [code] public static TransformationMatrix calculateDirectionalMatrix(Vector3d dir, Vector3d up) { float [] matrix = new float[16]; //Calculating as if a normal LookAt function: Vector3d forward = new Vector3d(dir); //Only with inverted direction and no height component. forward.setX(-forward.getX()); forward.setY(0.0f); forward.normalize(); Vector3d side = Vector3d.cross(forward , up); side.normalize(); Vector3d plane_up = Vector3d.cross(side , forward); plane_up.normalize(); matrix[0] = side.getX(); matrix[1] = plane_up.getX(); matrix[2] = -forward.getX(); matrix[3] = 0.0f; matrix[4] = side.getY(); matrix[5] = plane_up.getY(); matrix[6] = -forward.getY(); matrix[7] = 0.0f; matrix[8] = side.getZ(); matrix[9] = plane_up.getZ(); matrix[10] = -forward.getZ(); matrix[11] = 0.0f; matrix[12] = 0.0f; matrix[13] = 0.0f; matrix[14] = 0.0f; matrix[15] = 1.0f; //Complete directional matrix for the XZ part of the direction. TransformationMatrix ret = new TransformationMatrix(matrix); //Now if relevant we calculate the height component of the direction using the trigonometry function. if(dir.getY() != 0.0f) { float angle = (float)Math.toDegrees(Math.asin(dir.getY())); TransformationMatrix Y = TransformationMatrix.calculateRotationMatrix(angle, 0.0f, 0.0f); //We multiply matrices as D = XZ * Y; ret.multiply(Y); } //TADA! return ret; } [/code]
  4. Direction Vector to Rotation Matrix

    [quote name='haegarr' timestamp='1305889342' post='4813416'] ( [b]T[/b]( [b]p[/b] ) * [b]R[/b] )[sup]-1[/sup] = [b]R[/b][sup]-1[/sup] * [b]T[/b]( [b]p[/b] )[sup]-1[/sup] = [b]R[/b][sup]t[/sup] * [b]T[/b]( -[b]p[/b] ) [/quote] Thanks for the answer I'm trying to experiment with the transpose of the rotational part of the LookAt matrix, without much success unfortunately. However the weird thing is that with the transposed matrix I get some scaling effects when applied to a mesh. Should that happen?
  5. Hello! I've been trying to solve a (rather simple?) problem lately. I'm surprised I haven't been able to find anything really useful on the net so far. The thing is I have 3d direction vector. Use it to set the direction of an object in 3d space. To do that I need of course a transformation matrix. I have a function that properly calculates the LookAt matrix. However it is correct for the view transformation. I had no success in using it to calculate the rotation of the object. I have also tried using trigonometry using (assuming Y is up): [code] if(dir.getY() != 0.0f) xAngle = (float)Math.toDegrees(Math.atan((dir.getZ()*dir.getZ()+dir.getX()*dir.getX())/dir.getY())); if(dir.getZ() != 0.0f) yAngle = (float)Math.toDegrees(Math.atan(dir.getX()/dir.getZ())); TransformationMatrix.calculateRotationMatrix(xAngle, yAngle, 0.0f); [/code] However this does produce proper results only in certain situations. Can anybody suggest a solution? Thanks a lot