Как накапливать вращения камеры? - PullRequest
0 голосов
/ 14 мая 2011

Я хочу знать, как я могу накапливать повороты камеры, поэтому, когда я снова нажимаю на экран, вращение не сбрасывается в это место щелчка, а следит за вращением с этой точки, если это имеет смысл

Вот мой код. Это выполняется по событию перетаскивания нажатием / касанием.

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 );

1 Ответ

0 голосов
/ 15 мая 2011

Для начала вам нужно хранить некоторые данные о ротации в каком-то постоянном месте, лучше всего это использовать в качестве членов одного из ваших классов, но ради простого изменения предоставленного кода они могут быть статическими локальными переменными.

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 );

Это может делать то, что вы хотите для щелчков мыши, но не будет хорошо работать для сенсорных событий или перетаскивания мыши. Для событий касания вы хотите записать местоположение начала касания и использовать его в качестве основы для поворота вместо использования центра экрана.

...