0

カメラの回転を蓄積する方法を知りたいので、画面をもう一度クリックすると、回転はそのクリック位置にリセットされませんが、それが理にかなっている場合はその時点からの回転に従います

これが私のコードです。これは、クリック/タッチ ドラッグ イベントで実行されます。

ofVec3f camPos      = ofVec3f(0, 0, camDistance);
ofVec3f centerPos   = ofVec3f(0, 0, 0);

static float halfWidth  = ofGetWidth()/2;
static float halfHeight = ofGetHeight()/2;

float rotX = (touch.x-halfHeight) / (halfWidth);
float rotY = (touch.y-halfHeight) / (halfHeight);

camPos.rotate( rotY * 90, ofVec3f(1, 0, 0) );
camPos.rotate( rotX * 180, ofVec3f(0, 1, 0) );
camPos += centerPos;

cam.setPosition( camPos );
cam.lookAt( centerPos );
4

1 に答える 1

0

まず、いくつかの回転データを永続的な場所に保存する必要があります。これは、クラスの 1 つのメンバーとして最適ですが、提供したコードを変更するためだけに、静的なローカル変数にすることができます。

ofVec3f camPos      = ofVec3f(0, 0, camDistance);
ofVec3f centerPos   = ofVec3f(0, 0, 0);

//there is no need for these to be static unless ofGetWidth
//and ofGetHeight are expensive
float halfWidth  = ofGetWidth()/2;
float halfHeight = ofGetHeight()/2;

//these accumlate all change
static float camRotX=0.0f;
static float camRotY=0.0f;

float rotX = (touch.x-halfHeight) / (halfWidth);
float rotY = (touch.y-halfHeight) / (halfHeight);

camRotX+=rotX;
camRotY+=rotY;

camPos.rotate( camRotY * 90, ofVec3f(1, 0, 0) );
camPos.rotate( camRotX * 180, ofVec3f(0, 1, 0) );
camPos += centerPos;

cam.setPosition( camPos );
cam.lookAt( centerPos );

これは、マウス クリックに対しては望みどおりに機能するかもしれませんが、タッチ イベントやマウスのドラッグに対してはうまく機能しません。タッチ イベントの場合、画面の中心を使用する代わりに、タッチの開始位置を記録し、それを回転の基準として使用します。

于 2011-05-14T21:15:53.210 に答える