X operations(XOPS)に非常に近いFPSゲームを制作・リメイクし、成果物をオープンソースとして公開することを目的としたプロジェクトです。
Revision | 280 (tree) |
---|---|
Zeit | 2021-11-16 00:36:06 |
Autor | ![]() |
DirectXおよびOpenGLにおいて、カメラが真上・真下を向いた場合の処理を修正。(暫定対策)
@@ -1197,9 +1197,10 @@ | ||
1197 | 1197 | //! @param camera_rx カメラの横軸角度 |
1198 | 1198 | //! @param camera_ry カメラの縦軸角度 |
1199 | 1199 | //! @param viewangle 視野角 |
1200 | +//! @todo 真上/真下を向くと、所持武器のモデル描画の向きがおかしくなる。 | |
1200 | 1201 | void D3DGraphics::SetCamera(float camera_x, float camera_y, float camera_z, float camera_rx, float camera_ry, float viewangle) |
1201 | 1202 | { |
1202 | - float vUpVecF; | |
1203 | + float vUpVecF_x, vUpVecF_y, vUpVecF_z; | |
1203 | 1204 | D3DXMATRIX matWorld; |
1204 | 1205 | D3DXMATRIXA16 matView; |
1205 | 1206 |
@@ -1208,11 +1209,17 @@ | ||
1208 | 1209 | for(; camera_ry<D3DX_PI*-1; camera_ry += D3DX_PI*2){} |
1209 | 1210 | |
1210 | 1211 | //カメラの向きを決定 |
1211 | - if( fabs(camera_ry) < D3DX_PI/2 ){ | |
1212 | - vUpVecF = 1.0f; | |
1212 | + if( fabs(camera_ry) == D3DX_PI/2 ){ | |
1213 | + //真上or真下を向いているならば、カメラの上部指定を横向きにする。 | |
1214 | + vUpVecF_x = cos(camera_rx); vUpVecF_y = 0.0f; vUpVecF_z = sin(camera_rx); | |
1213 | 1215 | } |
1214 | 1216 | else{ |
1215 | - vUpVecF = -1.0f; | |
1217 | + if( fabs(camera_ry) < D3DX_PI/2 ){ | |
1218 | + vUpVecF_x = 0.0f; vUpVecF_y = 1.0f; vUpVecF_z = 0.0f; | |
1219 | + } | |
1220 | + else{ | |
1221 | + vUpVecF_x = 0.0f; vUpVecF_y = -1.0f; vUpVecF_z = 0.0f; | |
1222 | + } | |
1216 | 1223 | } |
1217 | 1224 | |
1218 | 1225 | D3DXMatrixIdentity(&matWorld); |
@@ -1226,7 +1233,7 @@ | ||
1226 | 1233 | //カメラ座標 |
1227 | 1234 | D3DXVECTOR3 vEyePt( camera_x, camera_y, camera_z ); |
1228 | 1235 | D3DXVECTOR3 vLookatPt( cos(camera_rx)*cos(camera_ry) + camera_x, sin(camera_ry) + camera_y, sin(camera_rx)*cos(camera_ry) + camera_z ); |
1229 | - D3DXVECTOR3 vUpVec( 0.0f, vUpVecF, 0.0f ); | |
1236 | + D3DXVECTOR3 vUpVec( vUpVecF_x, vUpVecF_y, vUpVecF_z ); | |
1230 | 1237 | D3DXMatrixLookAtLH( &matView, &vEyePt, &vLookatPt, &vUpVec ); |
1231 | 1238 | #if GRAPHIC_ENGINE == 0 |
1232 | 1239 | pd3dDevice->SetTransform(D3DTS_VIEW, &matView); |
@@ -1745,6 +1745,11 @@ | ||
1745 | 1745 | camera_y_flag = -1.0f; |
1746 | 1746 | } |
1747 | 1747 | |
1748 | + //真上or真下を向いているならば、カメラの上部指定を反転する。※DirectXと仕様を合わせるため | |
1749 | + if( fabs(camera_ry) == (float)M_PI/2 ){ | |
1750 | + camera_y_flag *= -1; | |
1751 | + } | |
1752 | + | |
1748 | 1753 | glMatrixMode(GL_PROJECTION); |
1749 | 1754 | glLoadIdentity(); |
1750 | 1755 | gluPerspective(viewangle*(180.0f/(float)M_PI), (float)width/height, CLIPPINGPLANE_NEAR, CLIPPINGPLANE_FAR); |
@@ -1940,6 +1945,7 @@ | ||
1940 | 1945 | //! @param in_camera_rx カメラの横軸角度 |
1941 | 1946 | //! @param in_camera_ry カメラの縦軸角度(-π〜π以内) |
1942 | 1947 | //! @param in_viewangle 視野角 |
1948 | +//! @todo 真上/真下を向くと、所持武器のモデル描画の向きがおかしくなる。 | |
1943 | 1949 | void D3DGraphics::SetCamera(float in_camera_x, float in_camera_y, float in_camera_z, float in_camera_rx, float in_camera_ry, float in_viewangle) |
1944 | 1950 | { |
1945 | 1951 | glViewport(0, 0, width, height); |