その場回転のやり方教えてください!(DXLIB?)

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
匿名

その場回転のやり方教えてください!(DXLIB?)

#1

投稿記事 by 匿名 » 8年前

3Dの三角形をその場で回転させたいのですが上手くいかずに困っています
全くわからないので皆さんの知恵を貸してください(>_<)
プログラムすべて記入すると長くなるので一部省略して記載します

現在

float rot;
VECTOR axis;
クォータニオンでrotとaxisで回転クォータニオン生成

MATRIX matRot = 回転クォータニオンから回転行列に変換したもの
平行移動行列生成
MATRIX matTrans = MGetTranslate(VGet(モデルの座標));
回転行列と平行移動行列を乗算
matRot = MMult(matRot, matTrans);
//行列をセット
MV1SetMatrix(モデルのハンドル, matRot);
MV1SetPosition(モデルのハンドル, モデルの座標);

ではモデルはその場で回転するのですが同じように

クォータニオンでrotとaxisで回転クォータニオン生成
MATRIX matRot = 回転クォータニオンから回転行列に変換したもの
平行移動行列生成
MATRIX matTrans = MGetTranslate(VGet(三角形の座標));
回転行列と平行移動行列を乗算
matRot = MMult(matRot, matTrans);

DrawTriangle3D(VTransform(VGet(三角形の座標からx座標を少しーに移動させた座標),matRot),
VTransform(VGet(三角形の座標からy座標を少し+に移動させた座標),matRot),
VTransform(VGet(三角形の座標からx座標を少し+に移動させた座標),matRot));

でやると上手くその場で回転しません。(旋回のような動きをします)
三角形のすべての頂点座標に行列を乗算すればできると思っていたのですが…
その後色々なサイトを調べていろいろ考えたのですが全然うまくいかずに放心状態です…
助けてください(´;ω;`)ウゥゥ

アバター
usao
記事: 1889
登録日時: 12年前
連絡を取る:

Re: その場回転のやり方教えてください!(DXLIB?)

#2

投稿記事 by usao » 8年前

>(DXLIB?)
の使用経験が無いので,割と想像ですが…

コード:

//ここは同じ
クォータニオンでrotとaxisで回転クォータニオン生成
MATRIX matRot = 回転クォータニオンから回転行列に変換したもの
MATRIX matTrans = MGetTranslate(VGet(三角形の座標));  //平行移動行列生成
matRot = MMult(matRot, matTrans);  //回転行列と平行移動行列を乗算

//「三角形の座標から」だった部分を「原点から」に変更
//(ここで記述する「三角形」なるモデルを原点中心で記述する)
DrawTriangle3D(VTransform(VGet(原点からx座標を少しーに移動させた座標),matRot),
VTransform(VGet(原点からy座標を少し+に移動させた座標),matRot),
VTransform(VGet(原点からx座標を少し+に移動させた座標),matRot));
としてもダメでしょうか?

あんどーなつ
記事: 171
登録日時: 8年前
連絡を取る:

Re: その場回転のやり方教えてください!(DXLIB?)

#3

投稿記事 by あんどーなつ » 8年前

数学的なうんちくでごめんね。

三角形の座標がA(ax, ay), B(bx, by), C(cx, cy)であるとき、こいつをその場で回転させたいというのは、
恐らく重心を求めて、その重心周りに回転させたいということでしょう。なので、まず重心G(gx, gy)を求めます。
G( (ax+bx+cx)/3, (ay+by+cy)/3 )

で、座標変換には平行移動Trans(tx, ty)と回転Rot(phi)があるけど、重心周りに回転させる変換Tは、
T = Trans(gx, gy) Rot(phi) Trans(-gx, -gy)になります。

つまり、次の変換を順番に適用します。
①重心Gの反対(-gx, -gy)に移動させる変換
②phiだけ回転
③重心Gの方向に移動させる変換

あんどーなつ
記事: 171
登録日時: 8年前
連絡を取る:

Re: その場回転のやり方教えてください!(DXLIB?)

#4

投稿記事 by あんどーなつ » 8年前

3Dは初めてですが、書いてみました。

コード:

#include "DxLib.h"

#define _USE_MATH_DEFINES

#include <math.h>

// プログラムは WinMain から始まります
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
	LPSTR lpCmdLine, int nCmdShow)
{
	if (DxLib_Init() == -1) return -1;

	float zofst = 500.0f;
	auto origin = VGet(0.0, 0.0, zofst);
	auto p_xaxis = VGet(500.0f, 0.0f, zofst);
	auto p_yaxis = VGet(0.0f, 500.0f, zofst);

	auto a = VGet(100.0f, 100.0f, zofst);
	auto b = VGet(100.0f, 400.0f, zofst);
	auto c = VGet(500.0f, 400.0f, zofst);
	auto g = VGet(700.0f/3.0f, 300.0f, zofst);

	auto rad = 0.0f * M_PI;
	auto t = MMult(MGetTranslate(VScale(g, -1.0f)), MMult(MGetRotZ(rad), MGetTranslate(g)));
	auto ta = VTransform(a, t);
	auto tb = VTransform(b, t);
	auto tc = VTransform(c, t);

	SetCameraScreenCenter(200.0f, 200.0f);
	DrawLine3D(origin, p_xaxis, GetColor(0, 0, 255));
	DrawLine3D(origin, p_yaxis, GetColor(0, 0, 255));
	DrawTriangle3D(ta, tb, tc, GetColor(255, 255, 255), TRUE);

	WaitKey();             // キー入力待ち

	DxLib_End();               // DXライブラリ使用の終了処理

	return 0;              // ソフトの終了 
}

匿名

Re: その場回転のやり方教えてください!(DXLIB?)

#5

投稿記事 by 匿名 » 8年前

コードまで書いていただきありがとうございました。
自分のコードと見比べてみたら自分のほうは三角形の頂点に乗算する行列の計算を間違えていたようで
無事回転させることができました。
皆さんありがとうございました。

アバター
usao
記事: 1889
登録日時: 12年前
連絡を取る:

Re: その場回転のやり方教えてください!(DXLIB?)

#6

投稿記事 by usao » 8年前

オフトピック
>三角形の頂点に乗算する行列の計算を間違えていた

という記述に個人的に不安を感じますが,大丈夫でしょうか.

間違っていたのは(どちらかといえば),乗算する行列の側ではなく,乗算される側,
すなわち 三角形の頂点座標の定義の仕方 では?

閉鎖

“C言語何でも質問掲示板” へ戻る