我有一些代码在opengl中创建一个3d视图,然后使用设备动作在其中查看。我知道这是有效的,因为我可以在我周围的空间放置三维立方体,并看到它们在正确的位置。 (我只是用x / y / z坐标创建它们。)
代码使用设备的旋转矩阵,然后将其应用于各个块。
CMRotationMatrix r = dm.attitude.rotationMatrix;
GLKMatrix4 baseModelViewMatrix = GLKMatrix4Make(r.m11, r.m21, r.m31, 0.0f,
r.m12, r.m22, r.m32, 0.0f,
r.m13, r.m23, r.m33, 0.0f,
0.0f, 0.0f, 0.0f, 1.0f);
float aspect = fabsf(self.view.bounds.size.width / self.view.bounds.size.height);
GLKMatrix4 projectionMatrix = GLKMatrix4MakePerspective(GLKMathDegreesToRadians(65.0f), aspect, kNearZ, kFarZ);
block.effect.transform.projectionMatrix = projectionMatrix;
我想要做的是弄清楚我在哪里,然后在我面前创建一个街区。
通过在一个方向上创建一个向量,将旋转矩阵应用于它然后读取它的新值,我获得了一些有限的成功。但它只适用于某些方向 - 当我旋转太远时它会混乱。
GLKVector4 vect = GLKVector4Make(0.0f,0.0f,10.0f,1.0f);
GLKVector4 newVec = GLKMatrix4MultiplyVector4(baseModelViewMatrix,vect);
然后我读了newVec.x,newVec.y,newVec.z并用它们来放置立方体。
有人可以告诉我,我是否在正确的轨道上吗?是否有更简单的方法来实现这一目标?
这一切的数学都非常令人生畏。
更新:
我使用
获得了部分成功 GLKVector3 newVec1 = GLKVector3Make(-r.m22, -r.m33, r.m21);
这仅适用于一个景观方向,并且仅适用于我当前位置周围的圆柱体。上/下轴不太正确。
旋转矩阵的这些部分是否足以得到我周围的任何一点?
更新2:
认为发布更多代码可能有助于使其更加清晰。
这就是所有内容的显示方式。
//1- get device position
CMDeviceMotion *dm = motionManager.deviceMotion;
CMRotationMatrix r = dm.attitude.rotationMatrix;
GLKMatrix4 baseModelViewMatrix = GLKMatrix4Make(r.m11, r.m21, r.m31, 0.0f,
r.m12, r.m22, r.m32, 0.0f,
r.m13, r.m23, r.m33, 0.0f,
0.0f, 0.0f, 0.0f, 1.0f);
GLKMatrix4 projectionMatrix = GLKMatrix4MakePerspective(GLKMathDegreesToRadians(45.0f), aspect, kNearZ, kFarZ);
//2- work out position ahead of current view
GLKVector3 newVector = GLKVector3Make(-r.m22, -r.m33, r.m21);
//place cube in 3d space- this works fine when just positioning with x,y,z co-ordinates
cube.effect.transform.projectionMatrix = projectionMatrix;
GLKMatrix4 modelViewMatrix = GLKMatrix4Identity;
modelViewMatrix = GLKMatrix4Translate(modelViewMatrix, newVector.x*100, newVector.y*100, newVector.z*100);
modelViewMatrix = GLKMatrix4Multiply(baseModelViewMatrix, modelViewMatrix);
cube.effect.transform.modelviewMatrix = modelViewMatrix;
答案 0 :(得分:0)
你看的向量应该可以乘以倒置矩阵。你没有写下你得到的结果,但这里有一些可能的解决方案:
编辑:(添加一些解释)
如果你的baseModelViewMatrix负责旋转你周围的所有物体,那么面向前方的矢量(显示方式)应该由baseModelViewMatrix的反转矩阵旋转。如果确实如果baseModelViewMatrix是同一个,那么面向前方的正确向量是(0,0,1),那么只需用倒置矩阵乘以(0,0,1)(你可以简单地试试,你甚至应该这样做,只需将其设置为标识并将对象放在(0,0,100)或其他任何位置)。如果不是,你应该找到面向前方的那个,并对它做同样的事。
关于我发布newVect2 = (-r.m13, -r.m23, r.m33)
的第二种方法,具体是指(0,0,1)是前向矢量的情况。这个想法是旋转矩阵由3个基本向量x,y,z组成,其中每行分别代表它们中的一个(它总是用于创建旋转矩阵但可能不可逆)。如果第3行确实代表z基矢量,那么矢量(0,0,1)将被转换为(r.m13,r.m23,r.m33),你似乎面对的那个是镜像的矢量通过它的正常(0,0,1)。对此的操作将是R'=正常*(2 *点(正常,R)) - R和对于法线为(0,0,1)且R为(r.m13,r.m23,r)的情况.m33),结果R'是(-r.m13,-r.m23,r.m33)。就像这里的注释一样,它可以转过来,z基矢量是(r.m31,r.m32,r.m33)。
在任何情况下,如果第3个选项不起作用,那么第2个选项和问题也可能是(0,0,1)不是身份的前向向量。