在SceneKit中使用Swift我试图生成一个与sceneView的pointOfView节点方向对齐的正方形的面,但是我无法理解执行此操作所需的数学。
我需要做的就是获取节点的当前位置(SCNVector3)并相对于初始中心点生成这些点,并垂直于摄像机的前向:
我有前进方向和当前位置:
let mat = self.sceneView.pointOfView.transform
let forwardDirection = SCNVector3(-1 * mat.m31, -1 * mat.m32, -1 * mat.m33)
let position = self.sceneView.pointOfView!.position
我只是无法弄清楚其余的数学问题。
答案 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));