问题
I am trying to rotate a group of vectors I sampled to the normal of a triangle
If this was correct, the randomly sampled hemisphere would line up with the triangle.
Currently I generate it on the Z-axis and am attempting to rotate all the samples to the normal of the triangle.
but it seems to be \"just off\"
glm::quat getQuat(glm::vec3 v1, glm::vec3 v2)
{
glm::quat myQuat;
float dot = glm::dot(v1, v2);
if (dot != 1)
{
glm::vec3 aa = glm::normalize(glm::cross(v1, v2));
float w = sqrt(glm::length(v1)*glm::length(v1) * glm::length(v2)*glm::length(v2)) + dot;
myQuat.x = aa.x;
myQuat.y = aa.y;
myQuat.z = aa.z;
myQuat.w = w;
}
return myQuat;
}
Which I pulled from the bottom of this page : http://lolengine.net/blog/2013/09/18/beautiful-maths-quaternion-from-vectors
Then I :
glm::vec3 zaxis = glm::normalize( glm::vec3(0, 0, 1) ); // hardcoded but test orginal axis
glm::vec3 n1 = glm::normalize( glm::cross((p2 - p1), (p3 - p1)) ); //normal
glm::quat myQuat = glm::normalize(getQuat(zaxis, n1));
glm::mat4 rotmat = glm::toMat4(myQuat); //make a rotation matrix
glm::vec4 n3 = rotmat * glm::vec4(n2,1); // current vector I am trying to rotate
回答1:
Construct 4x4 transform matrix instead of Quaternions.
Do not forget that OpenGL has column wise matrix
so for
double m[16];
isX
axis vector inm[ 0],m[ 1],m[ 2]
isY
axis vector inm[ 4],m[ 5],m[ 6]
isZ
axis vector inm[ 8],m[ 9],m[10]
and position is inm[12],m[13],m[14]
The LCS mean local coordinate system (your triangle or object or whatever)
and GCS mean global coordinate system (world or whatever).All the
X,Y,Z
vectors should be normalized to unit vectors otherwise scaling will occur.construction
- set
Z
-axis vector to your triangle normal - set position (LCS origin) to mid point of your triangle (or average point form its vertexes)
now you just need
X
andY
axises which is easylet
X = any triangle vertex - triangle midpoint
orX = substraction of any 2 vertexes of triangle
The only condition that must be met for
X
is that it must lie on triangle plane.
Now letY = X x Z
the cross product will create vector perpendicular toX
andZ
(which also lies in triangle plane).now put all this inside matrix and load it to OpenGL as
ModelView
matrix or what ever.
- set
来源:https://stackoverflow.com/questions/25207293/rotating-a-group-of-vectors