2017-10-02 10 views
2

OpenGL ES3、C++ 11、Android、私はオブジェクトとカメラを持っているので、私はオブジェクトをカメラに向かって見て、物体とカメラのビュー行列、カメラは私が次のことを試してみましたので、私は、画面をタッチすると、オブジェクトがカメラに向けて回転させたい、オブジェクトの周囲を回転:OpenGLはオブジェクトの顔カメラを作る

glm::vec3 up(0, 1, 0); 
glm::vec3 camFor(glm::cross(camera.getRight(), up)); 
GLfloat theta = glm::angle(glm::vec2(camFor.x, camFor.z), glm::vec2(getDirection().x, getDirection().z)); 
LOGI("game theta %f", theta); 
matrix = glm::rotate(matrix, theta, glm::vec3(0.0, 1.0, 0.0)); 

私は間の水平方向の角度を取得しますオブジェクトフォワードベクトルとカメラ前方にあるのはglm::vec3(matrix[2][0], matrix[2][1], matrix[2][2])です。カメラがオブジェクトの後ろに正確にあるとき、シータがpiに等しくなり、それが右の場合、オブジェクトにイベントを発生させるために画面にタッチしますカメラが回転し、カメラが見えるようになり、θがゼロになります。カメラを回転させて再びイベントを発生させると、予期せぬテータの値が得られます。 カメラの回転コードは次のとおりです。

void Camera::rotate(GLfloat xoffset, GLfloat yoffset, glm::vec3& c, double& delta, GLboolean constrainpitch) { 
    xoffset *= (delta * this->rotSpeed); 
    yoffset *= (delta * this->rotSpeed); 
    pitch += yoffset; 
    yaw += xoffset; 
    if (constrainpitch) { 
     if (pitch >= maxPitch) { 
      pitch = maxPitch; 
      yoffset = 0; 
     } 
     if (pitch <= minPitch) { 
      pitch = minPitch; 
      yoffset = 0; 
     } 
    } 
    glm::quat Qx(glm::angleAxis(glm::radians(yoffset), glm::vec3(1.0f, 0.0f, 0.0f))); 
    glm::quat Qy(glm::angleAxis(glm::radians(xoffset), glm::vec3(0.0f, 1.0f, 0.0f))); 
    glm::mat4 rotX = glm::mat4_cast(Qx); 
    glm::mat4 rotY = glm::mat4_cast(Qy); 
    view = glm::translate(view, c); 
    view = rotX * view; 
    view = view * rotY; 
    view = glm::translate(view, -c); 
} 

策:エラーは、これは正しい

glm::vec3& Camera::getRight() { 
    right = glm::vec3(view[0][0], view[1][0], view[2][0]); 
    return right; 
} 
+1

クエストを投稿してください質問に編集するのではなく、自分の答えに答えてください。 – LW001

答えて

2

あるカメラ行列の右のベクトルを取得していた

エラーはなっていましたカメラ行列の右ベクトルが正しいです

glm::vec3& Camera::getRight() { 
    right = glm::vec3(view[0][0], view[1][0], view[2][0]); 
    return right; 
} 
関連する問題