2010-11-20 4 views
5

전 세계에 데이터 세트를 표시하는 작은 프로젝트를 진행하고 있습니다. 줄거리를 완료했습니다. 이제 카메라 움직임을 구현하고 싶습니다.처리 및 OpenGL - 카메라 위치 변경 중?

사용자가 마우스를 누른 상태에서 마우스를 끌면 카메라 위치가 변경되는 코드가 있습니다. 문제는 마우스 움직임에서 카메라 움직임을 계산하는 방법을 잘 모르겠습니다.

카메라의 너비/2.0, 높이 /2.0, (높이 /2.0)/tan (PI * 60.0/360.0), 너비 /2.0, 높이 /2.0, 0, 0에 대한 카메라 코드입니다. , 1, 0);

어떻게 마우스 끌기와 관련하여 카메라 위치를 변경할 수 있습니까? (나는 카메라의 눈 위치를 상쇄하기 위해 mouseX과 쥐색의를 사용하여 시도했지만, 그것은 잘 작동하지 않습니다.)

+0

"카메라 코드"라고 말하면 모델 뷰 매트릭스입니까? 또는 장면 계산의 일부를 수행하는 "카메라"클래스/함수를 사용하고 있습니까? 장면을 이동하는 가장 간단한 방법은 카메라를 완전히 무시하고 대신 장면 자체를 이동하는 것입니다. "카메라 오프셋"을 렌더링하려는 모든 X, Y, Z 포인트에 추가하면됩니다. 이는 "카메라"를 이동하려는 위치의 반대입니다. – cecilkorik

+0

마우스 끌기에 따라 처리 카메라() 메서드의 변수를 변경하고 싶습니다. –

답변

2

당신이 방향 벡터를 가지고 있다면, 당신은 추상적 다음과 같은 카메라의 위치를 ​​(설정할 수 있습니다 코드) :

pos += speed * normalize(direction); 

앞으로 나아갈 수 있습니다. 뒤로 이동하려면 - 표준화 된 방향 vertor에 -1을 곱하면됩니다. (내 "하여 HelloWorld"응용 프로그램 중 하나에서 =) 벡터 연산에

pos += speed * normalize(cross_product(direction, upvector)); // strafing right 
pos += speed * normalize(cross_product(upvector, direction)); // strafing left 
다음

몇 가지주의 사항) : 왼쪽과 오른쪽 기총 소사를 들어, 뭔가이 사용

  • 정상화 (VEC)를;은 vec를 반환하며 길이는 1입니다. 이 하나는 필요한 길이로 vec를 "자른다"
  • cross_product (vec_a, vec_b);은 vec_a를 반환하고 vec_a는 vec_a에, vec_b는 vec_b에게 지시합니다 (자세한 내용은 this article 참조).

cross_product의 나의 버전은()은 다음과 같습니다 :이 도움이 될 것입니다

Vector Vector::CrossProduct(const Vector &v) 
{ 
    double k1 = (y * v.z) - (z * v.y); 
    double k2 = (z * v.x) - (x * v.z); 
    double k3 = (x * v.y) - (y * v.x); 

    return Vector(NumBounds(k1), NumBounds(k2), NumBounds(k3)); 
    // NumBounds(v) returns 0 when v is less than 10^-8 
} 

희망 =) 나는 peasycam을 사용하는 것입니다 할 가장 쉬운 것으로 생각

1

라이브러리

http://mrfeinberg.com/peasycam/

이 라이브러리는 카메라와 현재 상태에 대한 정보에 쉽게 액세스 할 수있는 다양한 getter뿐 아니라 다양한 방법으로 제한 할 수있는 마우스를 사용하여 카메라에 액세스 할 수 있습니다.