0
\$\begingroup\$

I'm playing with sun implementation in my engine and I correctly built model matrix using below order of matrix operations:

  1. Translate to camera position.
  2. Calculate x and y axis of rotation matrix using cross product. Z axis is equal to sun direction.

However I'd like to use function which takes into account two unit vectors and based on them build rotation matrix (explanation here). When I replace 2nd step with function call the sun is in completely different position on the sky (but correctly oriented). As a input vectors I set direction vector and [0, 1, 0] vector.

Could someone provide a solution/hint/explanation of that topic?

Code

Working solution:

Matrix matrix; matrix.setPosition(ActiveCamera.getInversedMatrix().pos);

Vector xaxis = Cross(Vector(0,1,0), direction);
xaxis.normalize();

Vector yaxis = Cross(direction, xaxis);
yaxis.normalize();

matrix.x.x = xaxis.x;
matrix.y.x = yaxis.x;
matrix.z.x = direction.x;

matrix.x.y = xaxis.y;
matrix.y.y = yaxis.y;
matrix.z.y = direction.y;

matrix.x.z = xaxis.z;
matrix.y.z = yaxis.z;
matrix.z.z = direction.z;

Not working solution:

Matrix matrix; matrix.setPosition(ActiveCamera.getInversedMatrix().pos);
matrix.setRotation(Vector(0, 1, 0), direction);

Matrix3& Matrix3::setRotation(const Vector &u, const Vector &v) {
    Vector cross = Cross(u, v);
    float sin = cross.magnitude(); // sine of angle
    cross.normalize();
    float cos = Dot(u, v); // cosine of angle

    this->x.x = cross.x * cross.x * (1 - cos) + cos;
    this->x.y = cross.x * cross.y * (1 - cos) + sin * cross.z;
    this->x.z = cross.x * cross.z * (1 - cos) - sin * cross.y;

    this->y.x = cross.x * cross.y * (1 - cos) - sin * cross.z;
    this->y.y = cross.y * cross.y * (1 - cos) + cos;
    this->y.z = cross.y * cross.z * (1 - cos) + sin * cross.x;

    this->z.x = cross.x * cross.z * (1 - cos) + sin * cross.y;
    this->z.y = cross.y * cross.z * (1 - cos) - sin * cross.x;
    this->z.z = cross.z * cross.z * (1 - cos) + cos;

    return (*this);
}
\$\endgroup\$
  • \$\begingroup\$ Can you post the code you have for this process? It's hard to tell what might be wrong without seeing your code. \$\endgroup\$ – user1118321 Aug 3 '18 at 2:32
  • \$\begingroup\$ To share a working solution, please add it as an Answer, not as en edit to the question. This makes it easier for users experiencing similar problems to search out answers that have worked for others in the past. \$\endgroup\$ – DMGregory Aug 7 '18 at 18:48
1
\$\begingroup\$

The code was ok. Start direction depends on the sun quad coordinates. I changed it to [0, 0, 1] and I got expected result. I also moved the sun quad by its direction. Otherwise I was unable to scale it.

\$\endgroup\$

Your Answer

By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.

Not the answer you're looking for? Browse other questions tagged or ask your own question.