0

OpenGL で世界を歩き回るクラスをやろうとしていますが、数学に問題があります。ここでの私の考えは、glm の関数 lookAt を使用してオブザーバーを希望の位置に設定し、関数に渡したポイントで操作することです。私が作った回転を行う関数は正しいと思いますが、walk メソッドの翻訳部分が間違っているようで、翻訳するだけ、または回転するだけでワールドを歩こうとするとうまくいくのですが、私は両方のことをするだけでめちゃくちゃになります。

これまでのクラスは次のとおりです。

#ifndef OBSERVER_H
#define OBSERVER_H

#include <GL/gl.h>
#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp>

class Observer {

private:

    glm::vec3 eye, center, upp;

public:

    glm::mat4 view;

    Observer() {}
    ~Observer() {}    

    void initialize(glm::vec3 eye, glm::vec3 center, glm::vec3 upp);
    void walk(GLfloat distance);
    void pitch(GLfloat pitch);
    void yaw(GLfloat yaw);
    void roll(GLfloat roll);
    void setView();
};

void Observer::initialize(glm::vec3 eye, glm::vec3 center, glm::vec3 upp) 
{
    this->eye = eye;
    this->center = center;
    this->upp = upp;
}

void Observer::walk(GLfloat distance) 
{
    glm::vec3 vector = glm::normalize(center - eye);
    glm::vec3 translate = vector*distance - vector;

    eye += translate;
    center += translate;
    upp += translate;
}

void Observer::roll(GLfloat roll) {
    glm::mat4 rotate(1.0f);

    rotate = glm::rotate(rotate, roll, glm::vec3(center - eye));

    center = glm::vec3(rotate * glm::vec4(center, 1.0f));
    upp = glm::vec3(rotate * glm::vec4(upp, 1.0f));
}

void Observer::yaw(GLfloat yaw) {
    glm::mat4 rotate(1.0f);

    rotate = glm::rotate(rotate, yaw, glm::vec3(upp - eye));

    center = glm::vec3(rotate * glm::vec4(center, 1.0f));
    upp = glm::vec3(rotate * glm::vec4(upp, 1.0f));
}

void Observer::pitch(GLfloat pitch) {
    glm::mat4 rotate(1.0f);
    glm::vec3 cross = glm::cross(center - eye, upp - eye);

    rotate = glm::rotate(rotate, pitch, cross);

    center = glm::vec3(rotate * glm::vec4(center, 1.0f));
    upp = glm::vec3(rotate * glm::vec4(upp, 1.0f));
}

void Observer::setView() 
{
    view = glm::lookAt(eye, center, upp);
}

#endif

そのため、描画を開始する直前に、プログラムの他の部分でこのクラスを使用してビュー マトリックスを設定しました。私の数学が正しいかどうか誰か教えてもらえますか?

4

1 に答える 1

2

場合は、ベクトルwalkではなく、目と中心位置のみを変換します。uppラインを外すだけupp += translate;

于 2013-03-24T21:59:02.387 に答える