クォータービューについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
イマダニ
記事: 145
登録日時: 7年前

クォータービューについて

#1

投稿記事 by イマダニ » 6年前

ふと疑問になったのでクォータービューについて質問します。
雑談に近い、ほんとしょーもないくだらない質問です。
こういう質問っていいんでしょうか?もしあれだったら以後二度とこのような質問はしません。

今まで僕は、しょぼいサイドビュー、しょぼいトップビューのゲームしか作ったことが無いんですが、
それらとクォータービューってプログラム上はなにが違うんでしょうか?

クォーターなんて画像変えるだけでどうにかなるんじゃないのと思ってたら
意外と思うように描画ができなかったので戸惑い、検索してみたところ

サイド、トップなどとは違い特殊な計算法、W(X-Y),H(X+Y)で描画するんだよとか、
描画順に注意しないといけないんだよとか、いろいろ、説明されてるサイトをいくつか見かけましたが、
どこも部分的な解説が多く、トップやサイドなどとの大まかな違いがわかっただけで
具体的にプログラム上でどのような違いが出るのかがいまいち把握できませんでした。
ただ単に調べきれてないだけなのかもしれませんが……

トップ、サイドでのマップ表示の基本?は

コード:

int MapData[ MAP_HEIGHT ][ MAP_WIDTH ] =
{
	{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } ,
	{ 0, 1, 0, 0, 0, 0, 0, 0, 0, 0 } ,
	{ 0, 1, 0, 1, 1, 1, 1, 1, 1, 0 } ,
	{ 0, 1, 0, 1, 1, 0, 0, 0, 1, 0 } ,
	{ 0, 1, 1, 1, 1, 0, 0, 0, 1, 0 } ,
	{ 0, 1, 0, 1, 0, 0, 0, 0, 1, 0 } ,
	{ 0, 1, 1, 1, 1, 1, 1, 1, 1, 0 } ,
	{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } 
} ;

このような配列を用意して1にチップを表示みたいな感じですよね。DX本家サイトのマップ表示のサンプルのような形です。
クォーターの場合はどうなるんでしょうか?同じように配列で表示できるのでしょうか?
また新たに必要な知識、数学の知識とか必要なんでしょうか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: クォータービューについて

#2

投稿記事 by softya(ソフト屋) » 6年前

ぐるぐる回すなら別ですが、単にクォータービューならパーツをCHIP_X*(X+Y),CHIP_Y*(X-Y)で描画すれば良いだけですよ。
まぁ、グラフ用紙に手で描いてみると分かります。

あと描画順に注意するのは、トップビューでも重ね合わせがあれば奥から描かねばなりません。

>また新たに必要な知識、数学の知識とか必要なんでしょうか?

中学レベルで出来ると思うのですけどね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

イマダニ
記事: 145
登録日時: 7年前

Re: クォータービューについて

#3

投稿記事 by イマダニ » 6年前

CHIP_Xがそのチップの横幅。
CHIP_Yがそのチップの縦幅。

X,Yがそのチップの座標という認識でいいんですよね?

つまり

コード:

#include"DxLib.h"

#define CHIP_SIZE 64
#define MAP_HEIGHT 8
#define MAP_WIDTH  10

//マップデータ
int MapData[ MAP_HEIGHT ][ MAP_WIDTH ] =
{
	{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } ,
	{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } ,
	{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } ,
	{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } ,
	{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } ,
	{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } ,
	{ 0, 1, 1, 1, 0, 0, 0, 0, 0, 0 } ,
	{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
};


int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
	ChangeWindowMode(TRUE),DxLib_Init(),SetDrawScreen(DX_SCREEN_BACK);

	//チップ画像読み込み
	int map;
	map = LoadGraph("img/mapchip01.bmp");

	while(ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0){

		//マップ描画
		for(int i=0;i<MAP_HEIGHT;i++){
			for(int j=0;j<MAP_WIDTH;j++){
				if(MapData[i][j]==1){
					DrawGraph(j*64,i*64,map,TRUE);//ここの部分?
				}
			}
		}
	}

	WaitKey();

	DxLib_End();

	return 0;
}
dragraphの座標の部分をCHIP_X*(X+Y),CHIP_Y*(X-Y)変えるだけで描画できるってことでいいんですか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: クォータービューについて

#4

投稿記事 by softya(ソフト屋) » 6年前

グラフィックがちゃんと四角の中に菱型(周り透明)で描かれているなら上手く表示されるはずです。
あと64x64だと縦長に見えるはず。なので64x20から64x32辺りで良さげなのを探ってください。
まぁ、聞くより実験した方が早いですけどね。

それとWaitKey();は不要。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

イマダニ
記事: 145
登録日時: 7年前

Re: クォータービューについて

#5

投稿記事 by イマダニ » 6年前

いろいろ、と言うほどいじってないんですが、
このプログラムでのチップのX座標とY座標がわからず、止まっております。
トップビューなどでは64×64の画像で

コード:

DrawGraph(j*64,i*64,map,TRUE);
で描画していました。なので

コード:

#include"DxLib.h"

#define CHIP_WIDTH 64
#define CHIP_HEIGHT 44
#define MAP_HEIGHT 8
#define MAP_WIDTH  10

//マップデータ
int MapData[ MAP_HEIGHT ][ MAP_WIDTH ] =
{
	{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } ,
	{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } ,
	{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } ,
	{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } ,
	{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } ,
	{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } ,
	{ 0, 1, 1, 1, 0, 0, 0, 0, 0, 0 } ,
	{ 0, 1, 1, 1, 0, 0, 0, 0, 0, 0 }
};


int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
	ChangeWindowMode(TRUE),DxLib_Init(),SetDrawScreen(DX_SCREEN_BACK);

	//チップ画像読み込み
	int map;
	map = LoadGraph("img/mapchip01.bmp");

	while(ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0){

		//マップ描画
		for(int i=0;i<MAP_HEIGHT;i++){
			for(int j=0;j<MAP_WIDTH;j++){
				if(MapData[i][j]==1){
					DrawGraph( CHIP_WIDTH*( j*CHIP_WIDTH + i*CHIP_HEIGHT ) , CHIP_HEIGHT*( j*CHIP_WIDTH - i*CHIP_HEIGHT ) ,map,TRUE);//ここの部分
				}
			}
		}
	}

	DxLib_End();

	return 0;
}
j×チップの横幅=それぞれのチップのX座標

i×チップの縦幅=それぞれのチップのY座標

と思い、実装したんですが、画像が出ません。原因はこの計算が間違っているというのはわかるんですが
それでどうしたら、チップのX座標とY座標わかるのかがわかりません。
アドバイスお願いします。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: クォータービューについて

#6

投稿記事 by softya(ソフト屋) » 6年前

ややこしいのでi,jではなくx,yを使ってください。

あとテスト方法も考えてみましょう。
DrawGraph( CHIP_WIDTH*( j*CHIP_WIDTH + i*CHIP_HEIGHT ) , CHIP_HEIGHT*( j*CHIP_WIDTH - i*CHIP_HEIGHT ) ,map,TRUE);//ここの部分
だとデバッガで表示しようとしている座標が確認できません。
じゃぁ、どうしようかと考えるのまで含めてのプログラミングですので動けば良いって作り方で作るのは悪い癖だと思ってください。

例えばこうします。
int chip_x = CHIP_WIDTH*( j*CHIP_WIDTH + i*CHIP_HEIGHT;
int chip_y = CHIP_HEIGHT*( j*CHIP_WIDTH - i*CHIP_HEIGHT;
DrawGraph(chip_x, chip_y map,TRUE);//ここの部分
こうすれば、表示しようとしている座標がデバッガで確認できますね。確認してみたください。

間違いが有るのは気づいていますがわざと放置しますので自分で考えてみください。
ひとつ言えるのは紙の上で計算してグラフ用紙に部分的にでも描いて確認していれば、こんなミスは起こさないと思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

イマダニ
記事: 145
登録日時: 7年前

Re: クォータービューについて

#7

投稿記事 by イマダニ » 6年前

ひとまずソフト屋さんのアドバイス通り、コードを

コード:

//マップ描画
		for(int y=0;y<MAP_HEIGHT;y++){
			for(int x=0;x<MAP_WIDTH;x++){
				if(MapData[y][x]==1){
					int chip_x = CHIP_WIDTH*( x*CHIP_WIDTH + y*CHIP_HEIGHT);
					int chip_y = CHIP_HEIGHT*( x*CHIP_WIDTH - y*CHIP_HEIGHT);
					DrawGraph(chip_x, chip_y, map,TRUE);//ここの部分
				}
			}
		}
	}
このようにコードを整理し、デバッグをしてみました。すると……

chip_x 19456 int
chip_y -7040 int

なんじゃこりゃ!

どう考えても計算が狂ってます……
それで方眼紙を買い、シャーペン片手に計算を始めようと思ったのですが、その前に少し確認したいことが一つ。

この計算作業の際に求めるのはそれぞれのチップ座標の求め方で、
その座標は、各配列要素に表示されるチップ画像の菱形の上の先っちょ部分ってことでいいんですよね?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: クォータービューについて

#8

投稿記事 by softya(ソフト屋) » 6年前

そうじゃないですね。
パーツは、ブラジルの国旗みたいな感じです。菱形は端までありますけどね。
「森林、樹木と国旗 ブラジル連邦共和国」
http://www.wood.co.jp/stamps/fl/br.htm
座標は旗の左上となります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

Idra

Re: クォータービューについて

#9

投稿記事 by Idra » 6年前

>このような配列を用意して1にチップを表示みたいな感じですよね。DX本家サイトのマップ表示のサンプルのような形です。
>クォーターの場合はどうなるんでしょうか?同じように配列で表示できるのでしょうか?
>また新たに必要な知識、数学の知識とか必要なんでしょうか?
トップビューとクォータービューの違いはスクリーンへの描画の仕方だけですから、配列は同じで構いません。
ベクトルの基底変換や座標変換の知識が役に立ちます。ベクトルを習ったことがない場合は大変かもですが。

イマダニ
記事: 145
登録日時: 7年前

Re: クォータービューについて

#10

投稿記事 by イマダニ » 6年前

>>softya(ソフト屋)さん
うわ、ブラジル便利。
とてもわかりやすい説明ありがとうございます。
早速、計算してみます。

>>Idraさん
アドバイス感謝です。
文系だったので数学Bまではやってないですね……
ベクトルはさっぱりです!

なので、数学Bの白チャートと4stepという問題集があるので、それで勉強してみます。
これだけで十分理解できますかね?
もし、それだけじゃ足りない、チャートなんかよりいい本あるよ、などなど何かあったら
アドバイスお願いします。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: クォータービューについて

#11

投稿記事 by softya(ソフト屋) » 6年前

私の意識では、中学ぐらいの知識で十分だと思いますけどね。
自由な角度に回転するのでは無いんで、ベクトルやら行列やらの難しい数式やら理論やらを知らなくても何となく分かるレベルだと思います。
知っていれば、それを使った方が楽かもしれませんが。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

イマダニ
記事: 145
登録日時: 7年前

Re: クォータービューについて

#12

投稿記事 by イマダニ » 6年前

64×40のチップを普通に並べて表示すると、

コード:

//マップデータ
int MapData[ MAP_HEIGHT ][ MAP_WIDTH ] =
{
	{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } ,
	{ 0, 1, 0, 0, 0, 0, 0, 0, 0, 0 } ,
	{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } ,
	{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } ,
	{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } ,
	{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } ,
	{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } ,
	{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
};
この唯一表示される1の部分の座標は(64,40)になりますよね?
それをクォーターの座標に変えるために、でいいのかな?
CHIP_X(x+y),CHIP_Y(x-y)にあてはめると

64(64+40),40(64-40)

おかしい。どう考えてもおかしい。

CHIP_X(x+y),CHIP_Y(x-y)

チップの幅×(X座標+Y座標)=クォータのX座標
チップの高さ×(X座標+Y座標)=クォーターのY座標

どうしてこれでクォータの座標に変わるんですか?
そこがよくわかりません。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: クォータービューについて

#13

投稿記事 by softya(ソフト屋) » 6年前

ピクセルの座標系とマップチップ配列の座標系が混同されています。
DrawGraphで使うのはピクセルの座標系。
CHIP_X(x+y)は、マップチップ配列の座標系からピクセル座標系に変換するための式です。

と思ったらCHIP_X(x+y)だと式に問題が有る気がします。私が間違った様ですね。
と言うことで、ちゃんと一緒に考えみましょう。
穴埋め問題です。次のP01,P02,P10,P11,P12のマップチップを表示させる座標を書きだしてください。
[0][0]とかマップチップ配列の添字番号です。
マップチップは64x40で、p00の座標は(a,0)とします。 ※P10が画面外なのは書き間違いなので御容赦ください。
クォータービュー.png
クォータービュー.png (8.05 KiB) 閲覧数: 3646 回
【補足】グラフ用紙に描くと分かると書いたのは、こういうイメージ図を書くと凄く具体的に考えられるからです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

Idra

Re: クォータービューについて

#14

投稿記事 by Idra » 6年前

softya(ソフト屋)さんのアプローチと違って混乱するかもしれませんが頑張って(笑)

クォータビューの座標系での点をスクリーンの座標系を使って表現すると考えます。
イマダニさんはちょうど逆になっている感じです。
例で1となる部分はクォータビューの座標系では(1,1)でいいですよね?

ですからCHIP_X(x+y),CHIP_Y(x-y)にあてはめると
64(1+1),40(1-1)となります。

64×40のチップということですが、そのサイズが菱型の全体を囲っているような感じならば、
半分の32×20としなければなりません。この辺りはベクトル無しではちょっと説明が難しいので諦めで・・・

高校の参考書があるなら軽く勉強してみるのもいいと思います。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: クォータービューについて

#15

投稿記事 by softya(ソフト屋) » 6年前

座標を埋めていけばベクトルを知らなくても、理論不明でも、そうしなければ行けないということは自然と分かる風に説明しているつもりなんですが。
どうしてもベクトルだと遠回りになるので避けたいんですよね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

イマダニ
記事: 145
登録日時: 7年前

Re: クォータービューについて

#16

投稿記事 by イマダニ » 6年前

Idraさんが説明してくれたベクトルのやり方は、
ベクトルのベの字も知らないぼくがそれをしっかり学んでからということで

今はソフト屋さんの穴埋め問題を解いて、クォーターの理解を深めたいと思います。
Idraさんわざわざ教えてくださったのにすみません……

で、この穴埋め問題を解く前に一つお尋ねしたいことがあります。

>>”ピクセルの座標系”と”マップチップ配列の座標系”が混同されています。

>>”クォータビューの座標系”での点を”スクリーンの座標系”を使って表現すると考えます。

座標系?一体なんなんだそれはぁーっ!?

初耳すぎて驚きを隠せません。ゲームに使う座標には種類があるということですか?
よければその”座標系”について詳しく教えてもらえませんか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: クォータービューについて

#17

投稿記事 by softya(ソフト屋) » 6年前

座標系と書いたのは概念的なもので、単位が違うと言ったほうが良いでしょうか。
ピクセルは長さの単位ですが、配列の添字の方は個数の単位(あるいはブロック単位の距離)です。
これを混同してるんじゃないかって事ですね。
CHIP_WIDTH*( x*CHIP_WIDTH + y*CHIP_HEIGHT);
書き換えると
横の長さ * ( 横の個数 * 横の長さ + 縦の個数 * 縦の長さ )
さて、これはとんでも無い計算をしていると何となくわかりませんか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

イマダニ
記事: 145
登録日時: 7年前

Re: クォータービューについて

#18

投稿記事 by イマダニ » 6年前

ピクセルの座標ではなく、配列の添字を代入してもおかしな数字になりますね。
カッコ内の個数のそれぞれにチップの幅をかけるのは間違いというのはなんとなくわかりました。
トップビューなどでやっていた

横の個数×チップの横幅

この計算式は、配列要素をピクセルの座標へ変えるトップビュー版の座標変換の公式?であって、

このクォータの座標変換の公式の

CHIP_WIDTH(X-Y)のX,Yの部分を求めるものではない。そもそも別物であるということですよね?

ほんとなんとなくですが、自分の間違いに気づけました。

ただなぜクォーターだと個数同士を足したり引いたりするのかがまだわかりません。
それにチップの幅の半分をかけるのは、チップ同士が隣接した時にできる、
余分な幅の大きさが、ちょうどチップの幅の半分だからというのはグラフ用紙に書いててなんとなくわかったんですが
足したり引いたりするのがまだわかっていません。

コード:

#include"DxLib.h"

#define CHIP_WIDTH 64
#define CHIP_HEIGHT 40
#define MAP_HEIGHT 16
#define MAP_WIDTH  20

//マップデータ
int MapData[ MAP_HEIGHT ][ MAP_WIDTH ] =
{
	{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } ,
	{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } ,
	{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } ,
	{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } ,
	{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } ,
	{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } ,
	{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } ,
	{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } ,
	{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } ,
	{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } ,
	{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } ,
	{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } ,
	{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } ,
	{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } ,
	{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } ,
	{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } 
};


int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
	ChangeWindowMode(TRUE),DxLib_Init(),SetDrawScreen(DX_SCREEN_BACK);

	//チップ画像読み込み
	int map;
	map = LoadGraph("img/mapchip01.bmp");

	while(ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0){

		//マップ描画
		for(int y=0;y<MAP_HEIGHT;y++){
			for(int x=0;x<MAP_WIDTH;x++){
				if(MapData[y][x]==1){
					DrawGraph(32*(x-y), 17*(x+y), map,TRUE);//ここの部分
				}
			}
		}
	}

	DxLib_End();

	return 0;
}
実際にプログラムに書いたら表示はできましたが、この際だからきっちり仕組みを理解したいです。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: クォータービューについて

#19

投稿記事 by softya(ソフト屋) » 6年前

それを理解するために、図の問題をやって欲しいのですが。
まぁ、本質はベクトルと回転なんですけどね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

イマダニ
記事: 145
登録日時: 7年前

Re: クォータービューについて

#20

投稿記事 by イマダニ » 6年前

p01(x,y)として、公式に当てはめると

x=32(1-0)
y=20(1+0)

こうなって、けいさんすると
p01の座標は(32,20)。

ほかの座標も同じように計算すると、

p02(64,40)、p10(-32,20)、p11(0,40)、p12(32,60) となる。

これであってます?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: クォータービューについて

#21

投稿記事 by softya(ソフト屋) » 6年前

あれ? 計算してますが、図から求めるんですよ。
見れば分かる座標関係だと思うんですが・・・。
図 → 座標 → 計算式を考える
だったんですが。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

イマダニ
記事: 145
登録日時: 7年前

Re: クォータービューについて

#22

投稿記事 by イマダニ » 6年前

順序が逆でしたね。本来の目的を忘れていた。
やり直します

イマダニ
記事: 145
登録日時: 7年前

Re: クォータービューについて

#23

投稿記事 by イマダニ » 6年前

あ、これよく見たら菱形の半分

p00からp01のy方向の距離がちょうど菱形の縦幅の半分、40の半分、20です。
それでp00からp01のx方向距離が、ちょうど菱形の横幅の半分、64の半分、32です。

えっとだからp01の座標は

p01(a+32,20)

です!

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: クォータービューについて

#24

投稿記事 by softya(ソフト屋) » 6年前

ねっ、見た目で座標が分かりますよね。
で残りの点を求めてみましょう。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

イマダニ
記事: 145
登録日時: 7年前

Re: クォータービューについて

#25

投稿記事 by イマダニ » 6年前

p02(a+64,40), p10(a-32,20), p11(a,40), p12(a+32,60)

です!

すげー!わかりやすい!
こうなってるんですね!

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: クォータービューについて

#26

投稿記事 by softya(ソフト屋) » 6年前

で座標関係から考えてみましょう。
P00(a,0) , p01(a+32,20), p02(a+64,40)
p10(a-32,20), p11(a,40), p12(a+32,60)

これから分かるのは、配列のy方向が増えると座標xとyも増えると言うことで、配列のx方向が増えると座標xが減少し、座標yが増えてますね。
すごく一定の法則性がよく分かります。
さて、分かりやすように配列の(x,y)を(mapx,mapy)としましょう。表示座標の(x,y)を(drawx,drawy)とします。

と言うことはdrawxはmapxが増えると減少しmapyが増えると増加するとなりますよね。それに大してdrawyはmapxとmapyの両方共増加します。
まとめると
drawx は mapxが1増えると [(1)] づつ減少し、mapyが1増えると [(2)] づつ増加します。
drawy は mapxが1増えると [(3)] づつ増加し、mapyが1増えると [(4)] づつ増加します。
となりますね。
さて問題です。(1)(2)(3)(4)を埋めてみましょう。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

イマダニ
記事: 145
登録日時: 7年前

Re: クォータービューについて

#27

投稿記事 by イマダニ » 6年前

drawx は mapxが1増えると 32 づつ減少し、mapyが1増えると 32 づつ増加します。
drawy は mapxが1増えると 20 づつ増加し、mapyが1増えると 20 づつ増加します。

(1)32

(2)32

(3)20

(4)20

こうですか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: クォータービューについて

#28

投稿記事 by softya(ソフト屋) » 6年前

じゃあ、そのまま式にしてみましょう。
drawx = ?
drawy = ?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

イマダニ
記事: 145
登録日時: 7年前

Re: クォータービューについて

#29

投稿記事 by イマダニ » 6年前

drawx=32(-mapx+mapy)
drawy=20(mapx+mapy)

こうですね!

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: クォータービューについて

#30

投稿記事 by softya(ソフト屋) » 6年前

そうですね。
ベクトルや行列を使わずに表示のための式が出来ましたね。
図を使うと直感的にイメージを掴めてイメージさえつかめれば簡単に式に出来る場合があります。数学知らないと出来ない場合もありますけどね。
まず、やってみて損はないでしょう。

あとは
drawx=a+32(-mapx+mapy)
drawy=20(mapx+mapy)
とすればaの値で横の表示位置を調整することが出来ます。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

イマダニ
記事: 145
登録日時: 7年前

Re: クォータービューについて

#31

投稿記事 by イマダニ » 6年前

やっぱり質問してよかったです。
ここまで丁寧に教えてもらえるなんて本当に感謝です。
ジャンプ、マップエディタの時といいソフト屋さんにはお世話になってばかりです。

クォーターの説明を見てると数式ばかりでてきて、
ここの過去のクォーター関連の質問も難しい数学の知識を使ったうえでの説明ばかりというか、
質問者がすでにベクトルを使ったうえで質問をしていたので、

ああ、やっぱり数学わかってないとだめだな。
数学Bの白チャート一冊終えるまでクォーターはあきらめよう

と思ってたんです。
でも一応、だめもとで質問してみるか、と今回、質問したら
まさかこんなにもわかりやすい答えが返ってくるとは……思ってもみなかったです。
softya(ソフト屋)さん、Idraさん。
お二方、僕の疑問に長く付き合ってくれて、本当にありがとうございます。

まあ数学ができないとできることが少ないというのは事実なのでIdraさんの言うとおり、
高校数学をゲーム制作と学業の合間に勉強します。
いつかは3dを扱ってみたいですしね。

またなにかあったらここで質問します。その時はよかったらまたよろしくお願いします。
今回はありがとうございました!

閉鎖

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