相对于SCNNode方向

时间:2017-09-20 21:32:31

标签: ios swift scenekit

在SceneKit中使用Swift我试图生成一个与sceneView的pointOfView节点方向对齐的正方形的面,但是我无法理解执行此操作所需的数学。

我需要做的就是获取节点的当前位置(SCNVector3)并相对于初始中心点生成这些点,并垂直于摄像机的前向: enter image description here

我有前进方向和当前位置:

let mat = self.sceneView.pointOfView.transform
let forwardDirection = SCNVector3(-1 * mat.m31, -1 * mat.m32, -1 * mat.m33)
let position = self.sceneView.pointOfView!.position

我只是无法弄清楚其余的数学问题。

1 个答案:

答案 0 :(得分:0)

pointOfView节点基本上是活动相机。因此,您可以创建一个SCNNode来保存面(通过创建其SCNGeometry),根据需要定位节点,然后将该节点添加为摄像头的子节点。然后,如果您在相机周围移动,面部节点将会跟随。

根据您的有限描述,另一种可能更适合的方法是使用spritekit叠加场景(因为它只是一个面)。

编辑:根据您在下面的评论,请找到包含以下代码(它在OBJ C中,但它会进行您似乎正在寻找的数学运算)。我将它用于类似的东西,与正常对齐(下面的轴变量是输入法线)。生成的矩阵rotMat应用于图像中的坐标应该可以解决问题。

    // Find a vector in the plane
    GLKVector3 tangent0 = [self crossVector:axis : GLKVector3Make(1, 0, 0)];
    if ([self dotVector:tangent0 : tangent0] < 0.001) {
        tangent0 = [self crossVector: axis: GLKVector3Make(0, 1, 0)];
    }
    tangent0 = [self normalizeVector: tangent0];

    // Find another vector in the plane
    GLKVector3 tangent1 = [self crossVector: axis: tangent0];
    tangent1 = [self normalizeVector: tangent1];

    //construct a 4x4 matrix using tangents and initial axis 
    GLKVector4 tangent0GLK4 = GLKVector4Make(tangent0.x, tangent0.y, tangent0.z, 0);
    GLKVector4 tangent1GLK4 = GLKVector4Make(tangent1.x, tangent1.y, tangent1.z, 0);
    GLKVector4 axisGLK4 = GLKVector4Make(axis.x, axis.y, axis.z, 0);

    GLKMatrix4 rotMat = GLKMatrix4MakeWithColumns(tangent0GLK4, tangent1GLK4, axisGLK4, GLKVector4Make(0, 0, 0, 1));