• R/O
  • SSH
  • HTTPS

Commit

Frequently used words (click to add to your profile)

javac++androidlinuxc#windowsobjective-cqtcocoa誰得pythonphprubygameguibathyscaphec翻訳計画中(planning stage)omegatframeworktwittertestdomvb.netdirectxbtronarduinopreviewerゲームエンジン

X operations(XOPS)に非常に近いFPSゲームを制作・リメイクし、成果物をオープンソースとして公開することを目的としたプロジェクトです。


Commit MetaInfo

Revision280 (tree)
Zeit2021-11-16 00:36:06
Autorxops-mikan

Log Message

DirectXおよびOpenGLにおいて、カメラが真上・真下を向いた場合の処理を修正。(暫定対策)

Ändern Zusammenfassung

Diff

--- trunk/d3dgraphics-directx.cpp (revision 279)
+++ trunk/d3dgraphics-directx.cpp (revision 280)
@@ -1197,9 +1197,10 @@
11971197 //! @param camera_rx カメラの横軸角度
11981198 //! @param camera_ry カメラの縦軸角度
11991199 //! @param viewangle 視野角
1200+//! @todo 真上/真下を向くと、所持武器のモデル描画の向きがおかしくなる。
12001201 void D3DGraphics::SetCamera(float camera_x, float camera_y, float camera_z, float camera_rx, float camera_ry, float viewangle)
12011202 {
1202- float vUpVecF;
1203+ float vUpVecF_x, vUpVecF_y, vUpVecF_z;
12031204 D3DXMATRIX matWorld;
12041205 D3DXMATRIXA16 matView;
12051206
@@ -1208,11 +1209,17 @@
12081209 for(; camera_ry<D3DX_PI*-1; camera_ry += D3DX_PI*2){}
12091210
12101211 //カメラの向きを決定
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);
12131215 }
12141216 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+ }
12161223 }
12171224
12181225 D3DXMatrixIdentity(&matWorld);
@@ -1226,7 +1233,7 @@
12261233 //カメラ座標
12271234 D3DXVECTOR3 vEyePt( camera_x, camera_y, camera_z );
12281235 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 );
12301237 D3DXMatrixLookAtLH( &matView, &vEyePt, &vLookatPt, &vUpVec );
12311238 #if GRAPHIC_ENGINE == 0
12321239 pd3dDevice->SetTransform(D3DTS_VIEW, &matView);
--- trunk/d3dgraphics-opengl.cpp (revision 279)
+++ trunk/d3dgraphics-opengl.cpp (revision 280)
@@ -1745,6 +1745,11 @@
17451745 camera_y_flag = -1.0f;
17461746 }
17471747
1748+ //真上or真下を向いているならば、カメラの上部指定を反転する。※DirectXと仕様を合わせるため
1749+ if( fabs(camera_ry) == (float)M_PI/2 ){
1750+ camera_y_flag *= -1;
1751+ }
1752+
17481753 glMatrixMode(GL_PROJECTION);
17491754 glLoadIdentity();
17501755 gluPerspective(viewangle*(180.0f/(float)M_PI), (float)width/height, CLIPPINGPLANE_NEAR, CLIPPINGPLANE_FAR);
@@ -1940,6 +1945,7 @@
19401945 //! @param in_camera_rx カメラの横軸角度
19411946 //! @param in_camera_ry カメラの縦軸角度(-π〜π以内)
19421947 //! @param in_viewangle 視野角
1948+//! @todo 真上/真下を向くと、所持武器のモデル描画の向きがおかしくなる。
19431949 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)
19441950 {
19451951 glViewport(0, 0, width, height);