[ad_1]
I attempt to make a spherical billboard that observe the digital camera’s course. However, the outcome that I bought is mannequin get distorted or occasion twisted. If I am utilizing solely a yaw/pitch quaternion per time, it really works completely(however I bought cylinder billboard as an alternative, which I did not need).
The sheep is participant. The black circle is the objects that I need spherical billboard impact.
Right here is the implementation.
void updateRotation(glm::vec3 cameraPosition, glm::vec3 playerPosition) {
glm::quat yaw_quat(1.0f, 0.0f, 0.0f, 0.0f), pitch_quat(1.0f, 0.0f, 0.0f, 0.0f);
//calculate yaw
glm::vec3 toProject(0.0f, 0.0f, 0.0f);
toProject = cameraPosition - playerPosition;
toProject.y = 0.0f;
glm::vec3 normailizedToProject = glm::normalize(toProject);
glm::vec3 normailizedObjLookAt(0.0f, 0.0f, 1.0f);
glm::vec3 upAxis = glm::cross(normailizedObjLookAt, normailizedToProject);
glm::vec3 normalizedUpAxis = glm::normalize(upAxis);
float dotProduct = glm::dot(normailizedObjLookAt, normailizedToProject);
if ((dotProduct < 0.99990f) && (dotProduct > -0.9999f)) {
yaw_quat = glm::angleAxis(acos(dotProduct), normalizedUpAxis);
}
//calculate pitch
toProject = glm::vec3(0.0f, 0.0f, 0.0f);
toProject = cameraPosition - playerPosition;
normailizedToProject = glm::normalize(toProject);
dotProduct = glm::dot(normailizedObjLookAt, normailizedToProject);
if ((dotProduct < 0.99990f) && (dotProduct > -0.9999f)) {
if(normailizedToProject.y < 0.0f) {
pitch_quat = glm::angleAxis(acos(dotProduct), glm::vec3(1.0f, 0.0f, 0.0f));
}
else {
pitch_quat = glm::angleAxis(acos(dotProduct), glm::vec3(-1.0f, 0.0f, 0.0f));
}
}
glm::quat rotationQuat = glm::normalize(yaw_quat * pitch_quat);
}
[ad_2]