みけCATのにっき(仮)
つれづれなるまゝに、日くらし、PCにむかひて、心に移りゆくよしなし事を、そこはかとなく書きつくれば、あやしうこそものぐるほしけれ。
(本当か!?)
出典

【3D】三角形に画像を貼り付けてみる

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

【3D】三角形に画像を貼り付けてみる

投稿記事 by みけCAT » 13年前

3D空間内の三角形に画像を貼り付けてみました。
1次変換を応用しています。

画像を貼り付ける部分のコードはこちらです。別に3Dの座標変換ソースがあります。

CODE:

#include "3d.h"
#include "bmpio.h"
#include "main.h"

static void setHenkan(double henkan[2][2],
		int width,int height,int x1,int y1,int x2,int y2) {
	henkan[0][0]=(double)x1/width;
	henkan[0][1]=(double)x2/height;
	henkan[1][0]=(double)y1/width;
	henkan[1][1]=(double)y2/height;
}

static int calcuateInvMatrix(double out[2][2],double in[2][2]) {
	double delta;
	delta=in[0][0]*in[1][1]-in[0][1]*in[1][0];
	if(delta==0)return 0;
	out[0][0]=in[1][1]/delta;
	out[0][1]=-in[0][1]/delta;
	out[1][0]=-in[1][0]/delta;
	out[1][1]=in[0][0]/delta;
	return 1;
}

void draw3dHenkan(
		int x1,int y1,int z1,
		int x2,int y2,int z2,
		int x3,int y3,int z3,
		int isUpper,const bmp_t* bmp,
		const camera_t* camera) {
	int xx1,yy1,xx2,yy2,xx3,yy3;
	double zz1,zz2,zz3;
	double tx,ty;
	int ux,uy,mx,my,dx,dy,temp;
	double uz,mz,dz,dtemp;
	int lx,rx;
	double lz,rz,nz;
	int i,j;
	int x,y,nx,ny;
	double henkan[2][2];
	double invHenkan[2][2];
	char debug[1024];
	henkan3dzahyou(&tx,&ty,&zz1,x1,y1,z1,camera);
	xx1=(int)tx;yy1=(int)ty;
	henkan3dzahyou(&tx,&ty,&zz2,x2,y2,z2,camera);
	xx2=(int)tx;yy2=(int)ty;
	henkan3dzahyou(&tx,&ty,&zz3,x3,y3,z3,camera);
	xx3=(int)tx;yy3=(int)ty;
	ux=xx1;uy=yy1;mx=xx2;my=yy2;dx=xx3;dy=yy3;
	uz=zz1;mz=zz2;dz=zz3;
	if(uy>my) {
		temp=ux;ux=mx;mx=temp;
		temp=uy;uy=my;my=temp;
		dtemp=uz;uz=mz;mz=dtemp;
	}
	if(my>dy) {
		temp=mx;mx=dx;dx=temp;
		temp=my;my=dy;dy=temp;
		dtemp=mz;mz=dz;dz=dtemp;
	}
	if(uy>my) {
		temp=ux;ux=mx;mx=temp;
		temp=uy;uy=my;my=temp;
		dtemp=uz;uz=mz;mz=dtemp;
	}
	if(isUpper) {
		setHenkan(henkan,bmpGetWidth(bmp),bmpGetHeight(bmp),
			xx2-xx1,yy2-yy1,xx3-xx1,yy3-yy1);
		if(!calcuateInvMatrix(invHenkan,henkan))return;
		for(i=uy;irx) {
				temp=lx;lx=rx;rx=temp;
				dtemp=lz;lz=rz;rz=dtemp;
			}
			for(j=lx;j=0 && y>=0 && xrx) {
				temp=lx;lx=rx;rx=temp;
				dtemp=lz;lz=rz;rz=dtemp;
			}
			for(j=lx;j=0 && y>=0 && xrx) {
				temp=lx;lx=rx;rx=temp;
				dtemp=lz;lz=rz;rz=dtemp;
			}
			for(j=lx;j=0 && y>=0 && xrx) {
				temp=lx;lx=rx;rx=temp;
				dtemp=lz;lz=rz;rz=dtemp;
			}
			for(j=lx;j=0 && y>=0 && xmy) {
		temp=ux;ux=mx;mx=temp;
		temp=uy;uy=my;my=temp;
		dtemp=uz;uz=mz;mz=dtemp;
	}
	if(my>dy) {
		temp=mx;mx=dx;dx=temp;
		temp=my;my=dy;dy=temp;
		dtemp=mz;mz=dz;dz=dtemp;
	}
	if(uy>my) {
		temp=ux;ux=mx;mx=temp;
		temp=uy;uy=my;my=temp;
		dtemp=uz;uz=mz;mz=dtemp;
	}
	for(i=uy;irx) {
			temp=lx;lx=rx;rx=temp;
			dtemp=lz;lz=rz;rz=dtemp;
		}
		for(j=lx;jrx) {
			temp=lx;lx=rx;rx=temp;
			dtemp=lz;lz=rz;rz=dtemp;
		}
		for(j=lx;j<=rx;j++) {
			nz=lz+(rx==lx?0:(rz-lz)*(j-lx)/(rx-lx));
			setRGB(j,i,r,g,b,nz);
		}
	}
}
コードのコピペが多いので、どうにかしたいです。

このような立方体1個なら、普通に60fps程度出ます。
catcube.png
立方体1個を描画
しかし、立方体を27個描画してみると、30fps程度に下がってしまいました。
manycatcube.png
立方体27個を描画
OpenMPを使えば高速化できるでしょうか?それとも逆に低速になるのでしょうか?

プログラム一式を添付しておきます。
方向キーでカメラを動かします。
Shift+左右キーでカメラを回転させます。
0~9(テンキーではない)で描画するものを変更できます。
1:立方体1個
2:立方体3個
3:立方体9個
4:立方体27個
5:大きい立方体1個
6:サイコロ1個
7:ベタ塗り立方体1個
8:立方体を組み合わせた図形1個
9:正八面体
0:円錐
添付ファイル

[拡張子 zip は無効化されているため、表示できません]

最後に編集したユーザー みけCAT on 2012年8月30日(木) 08:00 [ 編集 1 回目 ]
理由: カテゴリのつけ忘れ

コメントはまだありません。