質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

DirectX

DirectX(ダイレクトエックス)は、 マイクロソフトが開発したゲーム・マルチメディア処理用のAPIの集合です。

Q&A

2回答

4290閲覧

XMVECTORの使い方について

nanacha

総合スコア0

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

DirectX

DirectX(ダイレクトエックス)は、 マイクロソフトが開発したゲーム・マルチメディア処理用のAPIの集合です。

0グッド

0クリップ

投稿2021/12/16 10:37

最初に

学校の課題でDirectXの演算処理(?)について勉強しています。
今はベクトルの範囲で、ベクトルについてある程度理解はしているつもりですが
一個前の課題ではXMFLOATを使って実現していたことを
XMVECTORで実装する課題のようで調べても難しい文献ばかりで分からず質問させていただきました。

課題内容

三つの点を描画して、その三点で作られる三角形の重心を求め描画する。

発生している問題・エラーメッセージ

C2676 二項演算子 '+': 'DirectX::XMVECTOR' は、      この演算子または定義済の演算子に適切な型への変換の定義を行いません。(新しい動作; ヘルプを参照)

該当のソースコード

#include "Graphics.h" #include "SceneGame.h" #include "DebugDraw.h" inline float frand(float min, float max) { float num = (float)rand() / (float)RAND_MAX * (max * 2) - min; return num; } ---------------------------------------------------------------------------- void SceneGame::Update(float elapsedTime) { if (GetAsyncKeyState('1') & 1) { DirectX::XMVECTOR pVec[3] = {}; p[0] = { frand(-3.0, 3.0),frand(-3.0, 3.0), frand(-3.0, 3.0) }; p[1] = { frand(-3.0, 3.0),frand(-3.0, 3.0), frand(-3.0, 3.0) }; p[2] = { frand(-3.0, 3.0),frand(-3.0, 3.0), frand(-3.0, 3.0) }; pVec[0] = DirectX::XMLoadFloat3(&p[0]); pVec[1] = DirectX::XMLoadFloat3(&p[1]); pVec[2] = DirectX::XMLoadFloat3(&p[2]); wVec = (pVec[0] + pVec[1] + pVec[2]) / 3; } }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

結論

cpp

1void SceneGame::Update(float elapsedTime) 2{ 3 using namespace DirectX; 4 if (GetAsyncKeyState('1') & 1) 5 { 6 XMVECTOR pVec[3] = {}; 7 8 p[0] = { frand(-3.0, 3.0),frand(-3.0, 3.0), frand(-3.0, 3.0) }; 9 p[1] = { frand(-3.0, 3.0),frand(-3.0, 3.0), frand(-3.0, 3.0) }; 10 p[2] = { frand(-3.0, 3.0),frand(-3.0, 3.0), frand(-3.0, 3.0) }; 11 12 pVec[0] = XMLoadFloat3(&p[0]); 13 pVec[1] = XMLoadFloat3(&p[1]); 14 pVec[2] = XMLoadFloat3(&p[2]); 15 16 wVec = (pVec[0] + pVec[1] + pVec[2]) / 3; 17 } 18}

のように using namespace DirectX; を使う
または

cpp

1using DirectX::operator+; 2using DirectX::operator/;

などを明示的に書く
または

cpp

1DirectX::XMVECTOR wVec = DirectX::XMVectorDivide( 2 DirectX::XMVectorAdd(DirectX::XMVectorAdd(pVec[0], pVec[1]), pVec[2]), 3 DirectX::XMVectorReplicate(3));

のように加算、乗算用の関数を使う。

説明

DirectX::XMVECTOR にも operator+ は定義されているのですが、 DirectX 名前空間で宣言されているために呼び出せないケースがあります。
DirectX::XMVECTOR は環境によって SIMD 演算用の型 (__m128) になるなどする関係で直接メンバに触れることは推奨されていませんが、この __m128 のように DirectX 名前空間に含まれていない型については operator+名前探索の際に考慮されません。この場合、using namespace DirectX; としたり using DirectX::operator+; としたりすることで operator+ が適用可能になります。
しかし場合によっては DirectX::XMVECTORDirectX::__vector4 という型になることがあり(ハードウェアがサポートしていない場合、明示的にそういった演算を使用しない場合など)、この時は XMVECTORoperator+ が同じ名前空間にあるためにコンパイルが通ります。
DirectXMath.h の該当部分へのリンク

投稿2021/12/18 06:33

yaito3014

総合スコア176

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

...わからんなぁ
x,y,zそれぞれの平均値で XMVECTORを作っちゃいかんのか?

投稿2021/12/16 11:09

episteme

総合スコア16614

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nanacha

2021/12/18 00:38

XMFLOATの時は、 p[0].x + p[1].x +..... と言った感じでメンバ変数を使えたのですが、VECTORの方にはその様な機能がなくて... 足し算や掛け算も出来なそうなので詰んでしまいました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問