0

一人称カメラのスタイルを模倣したカメラを作るために最善を尽くしました。古いOpenGLレンダリング方法から切り替えたばかりで、カメラマトリックスに取り組む準備ができました。これが私のカメラアップデートのコードです。

void Camera::update(float dt)
{
// Get the distance the camera has moved
float distance = dt * walkSpeed;

// Get the current mouse position
mousePos = mouse->getPosition();

// Translate the change to yaw and pitch
angleYaw -= ((float)mousePos.x-400.0f)*lookSpeed/40;
anglePitch -= ((float)mousePos.y-300.0f)*lookSpeed/40;

// Clamp the camera to a max/min viewing pitch
if(anglePitch > 90.0f)
    anglePitch = 90.0f;

if(anglePitch < -90.0f)
    anglePitch = -90.0f;

// Reset the mouse position
mouse->setPosition(mouseReset);

// Check for movement events
sf::Event event;
while (window->pollEvent(event))
{

    // Calculate the x, y and z values of any movement
    if (event.type == sf::Event::KeyPressed && event.key.code == sf::Keyboard::W)
    {
        position.x -= (float)sin(angleYaw*M_PI/180)*distance*25;
        position.z += (float)cos(angleYaw*M_PI/180)*distance*25;
        position.y += (float)sin(anglePitch * M_PI / 180) * distance * 25;
        angleYaw = 10.0;
    }
    if (event.type == sf::Event::KeyPressed && event.key.code == sf::Keyboard::S)
    {
        position.x += (float)sin(angleYaw*M_PI/180)*distance*25;
        position.z -= (float)cos(angleYaw*M_PI/180)*distance*25;
        position.y -= (float)sin(anglePitch * M_PI / 180) * distance * 25;
    }
    if (event.type == sf::Event::KeyPressed && event.key.code == sf::Keyboard::R)
    {
        position.x += (float)cos(angleYaw*M_PI/180)*distance*25;
        position.z += (float)sin(angleYaw*M_PI/180)*distance*25;
    }
    if (event.type == sf::Event::KeyPressed && event.key.code == sf::Keyboard::A)
    {
        position.x -= (float)cos(angleYaw*M_PI/180)*distance*25;
        position.z -= (float)sin(angleYaw*M_PI/180)*distance*25;
    }
}

// Update our camera matrix
camMatrix = glm::translate(glm::mat4(1.0f), glm::vec3(-position.x, -position.z, -position.y));
camMatrix = glm::rotate(camMatrix, angleYaw, glm::vec3(0, 1, 0));
camMatrix = glm::rotate(camMatrix, anglePitch, glm::vec3(1, 0, 0));
}

最後の3行は、変換の反対でカメラを更新すると想定したものです(yとzは、使用している形式に切り替えられます)。私はそれらを間違った順序で行いましたか?

これが私の非常に単純なシェーダーです。

#version 120

attribute vec4 position;
uniform mat4 camera;

void main()
{
    gl_Position = position * camera;
}

#version 120
void main(void)
{
    gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
}

これは単に赤い三角形を作ります。カメラは三角形の周りを回転しますが、これは私が望んでいることではありません。カメラを回転させたい。カメラマトリックスに各頂点を掛けると、カメラ空間でのレンダリングが得られると思いました。それとも、それを射影行列で乗算する必要がありますか?

w、a、s、またはdを移動すると、一度にズームインし、ビュー全体が歪んで、どこにでも赤い断片が表示されます。

4

1 に答える 1

2

行列演算を逆の順序で記述します。したがって、(カメラの位置に)移動してから回転する場合は、次の順序で記述します。

// Update our camera matrix
camMatrix = glm::rotate(glm::mat4(1.0f), anglePitch, glm::vec3(1, 0, 0));
camMatrix = glm::rotate(camMatrix, angleYaw, glm::vec3(0, 1, 0));
camMatrix = glm::translate(camMatrix, glm::vec3(-position.x, -position.z, -position.y));
于 2012-07-23T12:18:54.423 に答える