2014-10-20 4 views
0

입자의 움직임에 대한 3D 시뮬레이션을 만들고 있는데, 특정 위치에 전기장을 나타내는 화살표를 그려야합니다. 블렌더에서 화살표 메쉬를 만들고 .obj로 내 보낸 (코드 생성기에서 .obj 로더를 만들었습니다.)하지만 올바른 방향으로 가리 키도록 제대로 회전 할 수 없습니다. , 비록 전기장 벡터가 적절하게 계산되었는지를 점검했지만. 나는 이상한 결과를 얻고있다. 예를 들어, 벡터가 위쪽을 가리키는 경우 아래쪽을 가리키지 만 x 축에서 회전하는 코드를 주석 처리하면 화살표가 의도 한 것과 같이 아래쪽을 향하게됩니다. 그런 다음 오른쪽을 가리 키도록되어 있으면 안쪽으로 (음의 z 축으로) 향하고 있지만 y 축의 회전을 주석 처리하면 오른쪽을 가리 킵니다.OpenGL에서 3D 벡터를 그리는 방법은 무엇입니까?

다음은 화살표의 회전 및 렌더링 내 코드입니다 :

void Render(Vector3 cameraPos) 
{ 
    glScalef(field.length() * ArrowLength,1.0,1.0); 
    glTranslatef(0,0,_zdefault); 
    glRotatef(Entity::yangle,0,1,0); 
    glTranslatef(pos.getX() + cameraPos.getX(), pos.getY() + cameraPos.getY(), pos.getZ() + cameraPos.getZ() - _zdefault); 

    glRotatef(atan2(field.getZ(),field.getY()) * 180/M_PI, 1.0,0.0,0.0); 
    glRotatef(atan2(field.getX(),field.getZ()) * 180/M_PI, 0.0,1.0,0.0); 
    glRotatef(atan2(field.getY(),field.getX()) * 180/M_PI, 0.0,0.0,1.0); 

    glBindTexture(GL_TEXTURE_2D,arrowTexture); 

    glCallList(arrow); 
    glLoadIdentity(); 
}; 

필드는 전기장을 나타내는 벡터이다. 의 선

glTranslatef(0,0,_zdefault); 
glRotatef(Entity::yangle,0,1,0); 

내가 종류의 믹서에 주위를 공전하는 것처럼, 전체 화면이 회전 할 수 있도록되어있다. 또한 Vector3는 아주 기본적인 기능으로 작성한 단순한 Vector 클래스입니다. 제가 말했듯이, 벡터 계산에는 아무런 문제가 없습니다. 나는 벡터를 사용하여 올바르게 일을 할 수 없다는 것을 확인했습니다.

내 앵글이 내가 atan2를 사용하는 glRotatef에서 약간 망가 졌다고 느낀다.하지만 이전에 설명한 회전이 어떻게 영향을 미치는지 이해할 수 없다.

벡터 구성 요소만을 기반으로 무언가를 회전시킬 수있는 방법이 있습니까?

+0

회전 각도를 처리하는 대신 회전 매트릭스를 직접 작성하는 것이 더 쉽습니다. 같은 종류의 문제에 대한 내 대답을보십시오. http://stackoverflow.com/questions/24705225/opengl-rotation-from-velocity-vector/24709587#24709587. –

+0

당신의 변형되지 않은 화살표는 어떤 방향을 가리 킵니까? 위의 대답은 원래의 벡터가 양의 z 방향을 가리키는 것입니다. 원래의 화살표를 적용하기 쉽습니다. x 방향의 점. 필요한 경우 새 버전의 답을 쓸 수 있습니다. –

답변

1

먼저 glRotatefglTranslatef 등의 레거시 파이프 라인을 사용하고 셰이더를 사용하고 대신 자신의 행렬을 관리해야합니다.

그것이 당신의 방향 방향과 field 당신은 단지 중심을 정의하고 같은과 그 주변의 모든 벡터를 회전 전체 장면을 회전 들어 up 벡터와 같은 일부까지

를 사용하여 lookAt 변환을 사용하는 것이 좋습니다 그 외에 변환 후 변환

관련 문제