旋转一组vector
我正在试图将我采样的一组向量旋转到三angular形的法线上
如果这是正确的,随机抽样的半球将与三angular形alignment。
目前我在Z轴上生成它,并试图将所有样本旋转到三angular形的法线。
但它似乎是“刚刚closures”
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; }
我从这个页面底部拉出来的: http : //lolengine.net/blog/2013/09/18/beautiful-maths-quaternion-from-vectors
然后我 :
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
构造4×4变换matrix而不是四元数 。
-
不要忘记,OpenGL具有列明智matrix
所以对于
double m[16];
是m[ 0],m[ 1],m[ 2]
X
轴向量,
是m[ 4],m[ 5],m[ 6]
Y
轴向量,
是m[ 8],m[ 9],m[10]
Z
轴向量,
位置在m[12],m[13],m[14]
LCS意味着局部坐标系(你的三angular形或物体或其他)
和GCS是指全球坐标系(世界或其他)。所有的
X,Y,Z
向量应归一化为单位向量,否则会出现缩放。 -
施工
- 将
Z
轴vector设置为你的三angular形法线 - 设置位置( LCS原点)到三angular形的中点(或平均点形成其顶点)
-
现在你只需要
X
和Y
X
,这很容易让
X = any triangle vertex - triangle midpoint
或者X = substraction of any 2 vertexes of triangle
X
必须满足的唯一条件是它必须位于三angular形平面上。
现在令Y = X x Z
,叉积将创build垂直于X
和Z
vector(也存在于三angular形平面中)。 -
现在把所有这些内部matrix,并加载到OpenGL作为
ModelView
matrix或什么。
- 将