3

iPhoneアプリで拡張現実のカメラオーバーレイとしてcocos3dの3Dオブジェクトを追加したいと思います。私はいくつかのモデルで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];
}

cocos(現在の軸を使用)の回転順序がデバイスの回転順序と一致しないため、cam.rotation = cc3v(pitch、roll、yaw)を直接使用できませんでした。しかし、私のコードも正しく機能していません。カメラを手動で回転させているときにエラーが発生しました。カメラを正しく回転させるにはどうすればよいかわかりません(順序と軸のほぼすべての組み合わせを試しました)。

では、問題は、ココスのカメラの回転とデバイスのカメラの回転をどのように一致させることができるかということです。私は何かが足りないのですか?または、そのような主題のコードまたはチュートリアルプロジェクトを提供できますか?三角法しかないので、それは簡単な質問だと思いますが、やろうと思ってしまいました。

ありがとう!

4

1 に答える 1

1

そのコードで終了しました、それはうまくいきます

-(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)に設定しました

于 2012-07-27T11:42:24.880 に答える