当我在SceneKit
中创建一个平面时,平面的法向量默认为正z轴。我想通过使用不同的法向量来重新定向平面。但是,我不知道如何将平面旋转到正确的位置,即使我知道新的法向量应该是什么。思考?
以下是基于输入SCNVector3'轴'(这将是您的目标法线)创建旋转矩阵的示例。
SCNVector3 tangent0 = [self crossVector: axis: SCNVector3Make(1, 0, 0)];
if ([self dotVector:tangent0 : tangent0] < 0.001) {
tangent0 = [self crossVector: axis: SCNVector3Make(0, 1, 0)];
}
tangent0 = [self normalizeVector:tangent0];
SCNVector3 tangent1 = [self normalizeVector: [self crossVector:axis: tangent0]];
GLKVector4 tangent0GLK = GLKVector4Make(tangent0.x, tangent0.y, tangent0.z, 0);
GLKVector4 tangent1GLK = GLKVector4Make(tangent1.x, tangent1.y, tangent1.z, 0);
GLKVector4 axisGLK = GLKVector4Make(axis.x, axis.y, axis.z, 0);
rotMat = GLKMatrix4MakeWithColumns(tangent0GLK, tangent1GLK, axisGLK, GLKVector4Make(0, 0, 0, 1));
然后,您可以使用乘法将其应用于平面节点的transform属性:
_node.transform = SCNMatrix4Mult(transmat, SCNMatrix4FromGLKMatrix4( rotMat)) );
以上是我正在研究的项目,没有单独测试过。不包括cross,dot和normalizeVector。