我试图将我采样的一组矢量旋转到三角形的法线
如果这是正确的,随机抽样的半球将与三角形对齐。
目前我在Z轴上生成它并试图将所有样本旋转到三角形的法线。
但它似乎是"关闭"
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
答案 0 :(得分:8)
构建4x4 transform matrix而不是 Quaternions 。
不要忘记OpenGL具有列式矩阵
所以double m[16];
是X
中的m[ 0],m[ 1],m[ 2]
轴向量
是Y
中的m[ 4],m[ 5],m[ 6]
轴向量
是Z
中的m[ 8],m[ 9],m[10]
轴向量
和位置在m[12],m[13],m[14]
LCS 表示局部坐标系(您的三角形或物体或其他)和 GCS 表示全局坐标系(世界或其他)。
应将所有X,Y,Z
向量标准化为单位向量,否则将进行缩放。
<强>构造强>
Z
- 轴向量设置为三角法线现在您只需要X
和Y
轴即可轻松
让X = any triangle vertex - triangle midpoint
或X = substraction of any 2 vertexes of triangle
X
必须满足的唯一条件是它必须位于三角形平面上。
现在让Y = X x Z
叉积将创建垂直于X
和Z
的矢量(也位于三角形平面内)。
现在将所有这些都放在矩阵中并将其加载到 OpenGL 作为ModelView
矩阵或者其他任何内容。