我想从cocos3d中添加3D对象作为相机叠加层,以在我的iPhone应用程序中增强现实。我有一些模型的CC3Scene。我创建了motionManager捕获以获取有关设备相机方向的信息,然后在-(void)update:(ccTime)dt中尝试更新cocos3d场景相机的位置(场景的向上方向为Z轴) :
-(void) update:(ccTime)dt
{
CMDeviceMotion *currentDeviceMotion = motionManager.deviceMotion;
CMAttitude *currentAttitude = currentDeviceMotion.attitude;
CC3Camera *cam = (CC3Camera*)[cc3Scene getNodeNamed:@"Camera"];
static double lastY = 0;
static double lastP = 0;
static double lastR = 0;
double yaw = CC_RADIANS_TO_DEGREES(currentAttitude.yaw-lastY);
double pitch = CC_RADIANS_TO_DEGREES(currentAttitude.pitch-lastP);
double roll = CC_RADIANS_TO_DEGREES(currentAttitude.roll-lastR);
CC3Vector fd = cc3v(0,1,0);
[cam rotateByAngle:roll aroundAxis:fd];
CC3Vector rp = cc3v(1,0,0);
[cam rotateByAngle:pitch aroundAxis:rp];
CC3Vector up = cc3v(0,0,1);
[cam rotateByAngle:yaw aroundAxis:up];
lastY = currentAttitude.yaw;
lastP = currentAttitude.pitch;
lastR = currentAttitude.roll;
[super update:dt];
}
我无法直接使用cam.rotation = cc3v(俯仰,滚动,偏航),因为cocos中的旋转顺序(使用我当前的轴)与设备中的旋转顺序不匹配。但是我的代码也不正确。手动旋转相机时出现错误,我不知道应该如何旋转以使其正确(我已经尝试过几乎所有顺序和轴的组合)。
因此,问题是我该如何匹配cocos的相机旋转和设备的旋转?我想念什么吗?还是可以提供带有此类主题的代码或教程项目?我知道这是一个很简单的问题,因为只有三角函数,但是我已经想尽办法了。
谢谢!
最佳答案
完成该代码,效果很好
-(CC3Vector4)multiplyQuaternion:(CC3Vector4)q2 onAxis:(CC3Vector4)axis byDegress:(float)degrees{
CC3Vector4 q1;
q1.x = axis.x;
q1.y = axis.y;
q1.z = axis.z;
// Converts the angle in degrees to radians.
float radians = CC_DEGREES_TO_RADIANS(degrees);
// Finds the sin and cosine for the half angle.
float sin = sinf(radians * 0.5);
float cos = cosf(radians * 0.5);
// Formula to construct a new Quaternion based on direction and angle.
q1.w = cos;
q1.x = q1.x * sin;
q1.y = q1.y * sin;
q1.z = q1.z * sin;
// Multiply quaternion, q1 x q2 is not equal to q2 x q1
CC3Vector4 newQ;
newQ.w = q1.w * q2.w - q1.x * q2.x - q1.y * q2.y - q1.z * q2.z;
newQ.x = q1.w * q2.x + q1.x * q2.w + q1.y * q2.z - q1.z * q2.y;
newQ.y = q1.w * q2.y - q1.x * q2.z + q1.y * q2.w + q1.z * q2.x;
newQ.z = q1.w * q2.z + q1.x * q2.y - q1.y * q2.x + q1.z * q2.w;
return newQ;
}
-(void)updateCameraFromMotion:(CMDeviceMotion *)deviceMotion {
CMAttitude * attitude = deviceMotion.attitude;
CMQuaternion quaternion = attitude.quaternion;
CC3Vector4 camQuaternion;
camQuaternion.w = quaternion.w;
camQuaternion.x = -quaternion.x;
camQuaternion.y = -quaternion.z;
camQuaternion.z = quaternion.y;
camQuaternion = [self multiplyQuaternion:camQuaternion onAxis:CC3Vector4Make(1, 0, 0, 0) byDegress:90];
self.activeCamera.quaternion = camQuaternion;
}
请注意,相机在启动时的forwardDirection确实很重要,我将其设置为(1,0,0)