1次変換を応用しています。
画像を貼り付ける部分のコードはこちらです。別に3Dの座標変換ソースがあります。
#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程度出ます。 しかし、立方体を27個描画してみると、30fps程度に下がってしまいました。 OpenMPを使えば高速化できるでしょうか?それとも逆に低速になるのでしょうか?
プログラム一式を添付しておきます。
方向キーでカメラを動かします。
Shift+左右キーでカメラを回転させます。
0~9(テンキーではない)で描画するものを変更できます。
1:立方体1個
2:立方体3個
3:立方体9個
4:立方体27個
5:大きい立方体1個
6:サイコロ1個
7:ベタ塗り立方体1個
8:立方体を組み合わせた図形1個
9:正八面体
0:円錐