BGE : Fix T43800: getScreenVect()/getScreenPosition()/modelview_matrix returns incorrect results

The getScreenVect(), getScreenPosition() and modelview_matrixmethod returns an incorrect results if called after the camera has been translated on the same frame.
The model view matrix will be update only once per frame with Cam->SetModelviewMatrix in KX_KetsjiEngine::RenderFrame.
Using GetWorldToCamera as model view matrix to get an actual view matrix even if the camera is moved.

Reviewers: sergey, dfelinto, brita_, sybren, hg1, campbellbarton

Reviewed By: hg1, campbellbarton

Projects: #game_engine

Differential Revision: https://developer.blender.org/D1170
This commit is contained in:
Thomas Szepe 2015-04-10 20:20:52 +02:00
parent 35812e65f4
commit 465a5d29c0
Notes: blender-bot 2023-02-14 11:52:55 +01:00
Referenced by issue #44404, freestyle crashes blender
Referenced by issue #44380, Auto Smooth angle entry greyed out.
Referenced by issue #43800, KX_Camera.getScreenVect() returns incorrect results if called after camera has been moved on the same frame.
Referenced by issue #36617, Camera model_viewmatrix update from Python
2 changed files with 4 additions and 4 deletions

View File

@ -886,7 +886,7 @@ int KX_Camera::pyattr_set_projection_matrix(void *self_v, const KX_PYATTRIBUTE_D
PyObject *KX_Camera::pyattr_get_modelview_matrix(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
{
KX_Camera* self = static_cast<KX_Camera*>(self_v);
return PyObjectFrom(self->GetModelviewMatrix());
return PyObjectFrom(self->GetWorldToCamera());
}
PyObject *KX_Camera::pyattr_get_camera_to_world(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
@ -995,7 +995,7 @@ KX_PYMETHODDEF_DOC_O(KX_Camera, getScreenPosition,
GLdouble modelmatrix[16];
GLdouble projmatrix[16];
MT_Matrix4x4 m_modelmatrix = this->GetModelviewMatrix();
MT_Matrix4x4 m_modelmatrix = this->GetWorldToCamera();
MT_Matrix4x4 m_projmatrix = this->GetProjectionMatrix();
m_modelmatrix.getValue(modelmatrix);
@ -1038,7 +1038,7 @@ KX_PYMETHODDEF_DOC_VARARGS(KX_Camera, getScreenVect,
GLdouble modelmatrix[16];
GLdouble projmatrix[16];
MT_Matrix4x4 m_modelmatrix = this->GetModelviewMatrix();
MT_Matrix4x4 m_modelmatrix = this->GetWorldToCamera();
MT_Matrix4x4 m_projmatrix = this->GetProjectionMatrix();
m_modelmatrix.getValue(modelmatrix);

View File

@ -192,7 +192,7 @@ public:
void InvalidateProjectionMatrix(bool valid = false);
/** Gets the modelview matrix that is used by the rasterizer.
* \warning If the Camera is a dynamic object then this method may return garbage. Use GetCameraToWorld() instead.
* \warning If the Camera is a dynamic object then this method may return garbage. Use GetWorldToCamera() instead.
*/
const MT_Matrix4x4& GetModelviewMatrix() const;