合計 昨日 今日

DirectX ビルボード[C++]

フォーラムルール
フォーラムルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Name: Indent
[URL]
ぴよぴよ(92 ポイント)
Date: 2017年12月18日(月) 15:04
No: 1
(OFFLINE)

 DirectX ビルボード[C++]

現在DirectXで3Dゲームを作っています。

プレイヤーをビルボードで表現したいのですが、平行移動とスケールはうまくいくのに回転がうまくいきません。

カメラの角度を変えずにz回転すると問題ないのですが、カメラの移動をしてからプレイヤーを回転させるとz軸が補正(?)されていないせいか斜めに回転してしまいます。

ネットで検索して調べたのですがうまくいかなかったので、計算の仕方を教えてください。

Name: pell
[URL]
Date: 2018年1月04日(木) 14:44
No: 2
(OFFLINE)

 Re: DirectX ビルボード[C++]

LookAtとかでも調べてみたらいいかも。
DirectXMathとD3D11でやるならこうなる。
XMMatrixLookAtLH。
コード[C++]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
   D3D11_MAPPED_SUBRESOURCE MappedResource;
   CBChangesFrame* cb;
   XMMATRIX Rot = XMMatrixIdentity();
    XMFLOAT3 fl = XMFLOAT3(0.0f, 1.0f, 0.0f);
    FXMVECTOR EyePosition = XMLoadFloat3(&g_vmove);//カメラ座標
    FXMVECTOR FocusPosition = XMLoadFloat3(&fl);
    FXMVECTOR UpDirection = XMVectorSet(0.0f, 1.0f, 0.0f, 1.0f);
 
    XMVECTOR EyeDirection = XMVectorSubtract(FocusPosition, EyePosition);
 
    XMVECTOR R2 = XMVector3Normalize(EyeDirection);
 
    XMVECTOR R0 = XMVector3Cross(UpDirection, R2);
    R0 = XMVector3Normalize(R0);
 
    XMVECTOR R1 = XMVector3Cross(R2, R0);
 
    XMVECTOR NegEyePosition = XMVectorNegate(EyePosition);
 
    XMVECTOR D0 = XMVector3Dot(R0, NegEyePosition);
    XMVECTOR D1 = XMVector3Dot(R1, NegEyePosition);
    XMVECTOR D2 = XMVector3Dot(R2, NegEyePosition);
 
    Rot.r[0] = XMVectorSelect(D0, R0, g_XMSelect1110.v);
    Rot.r[1] = XMVectorSelect(D1, R1, g_XMSelect1110.v);
    Rot.r[2] = XMVectorSelect(D2, R2, g_XMSelect1110.v);
    Rot.r[3] = g_XMIdentityR3.v;
 
    Rot = XMMatrixTranspose(Rot);
    Rot = XMMatrixInverse(nullptr, Rot);
// オフセットを切る
    Rot.r[3].m128_f32[0] = 0.0f;  
    Rot.r[3].m128_f32[1] = 0.0f;
    Rot.r[3].m128_f32[2] = 0.0f;
 
    pd3dImmediateContext->Map(g_pCBChangesFrame, 0, D3D11_MAP_WRITE_DISCARD, 0, &MappedResource);
    cb = (CBChangesFrame*)MappedResource.pData;
    cb->matWLP = XMMatrixTranspose(Rot/* *g_matLightVP*/);
    pd3dImmediateContext->Unmap(g_pCBChangesFrame, 0);
 
    DrawMesh(g_pMesh);


Return to C言語何でも質問掲示板

オンラインデータ

このフォーラムを閲覧中のユーザー: なし & ゲスト[16人]