3D

情報工学基礎演習 3D描画用ツール

C言語 ソースコード
--------------------------------------------------------------------------------------------------------------------
#include<stdio.h>

void box();
void tree1();
void tree2();
void pole();
void texmake();
void texexpo();

int main(){
int t=1;
printf("注意 小数座標には対応していません\n");
while(t!=0){
printf("終了:0 直方体:1 円柱:2\n");
printf("木A:3 木B:4\n");
printf("texture maker:10 texture exporter:20\n");
printf("タイプ:");
scanf("%d", &t);
if (t==0){}
else if(t==1){box();}
else if(t==2){pole();}
else if(t==3){tree1();}
else if(t==4){tree2();}
else if(t==10){texmake();}
else if(t==20){texexpo();}
/*else if()*/
else{}
}
return 0;
}

void box(){
int x, y, z, xl, yl, zl;
printf("左上座標(x)=");scanf("%d", &x);printf("左上座標(y)=");scanf("%d", &y);
printf("左上座標(z)=");scanf("%d", &z);printf("サイズ(x)=");scanf("%d", &xl);
printf("サイズ(y)=");scanf("%d", &yl);printf("サイズ(z)=");scanf("%d", &zl);
printf("BOX{P %d. %d. %d. C 1. 1. 1. S %d. %d. %d. T 0.}\n", x+xl/2, y+yl/2, z+zl/2, xl, yl, zl);
}

void pole(){
int v, x, y, z, r, h;
printf("向き x:1 y:2 z:3=");scanf("%d", &v);
printf("底辺座標(x)=");scanf("%d", &x);
printf("底辺座標(y)=");scanf("%d", &y);
printf("底辺座標(z)=");scanf("%d", &z);
printf("半径=");scanf("%d", &r);
printf("長さ=");scanf("%d", &h);
if(v==1){printf("POLE_X{P %d. %d. %d. C 1. 1. 1. R %d. H %d. T 0.}\n", x+h/2, y, z, r, h);}
else if(v==2){printf("POLE_Y{P %d. %d. %d. C 1. 1. 1. R %d. H %d. T 0.}\n", x, y+h/2, z, r, h);}
else if(v==3){printf("POLE_Z{P %d. %d. %d. C 1. 1. 1. R %d. H %d. T 0.}\n", x, y, z+h/2, r, h);}
else {}
}

void tree1(){
int x, z, s;
printf("座標(x)=");scanf("%d", &x);
printf("座標(z)=");scanf("%d", &z);
printf("POLE_Y{P %d. 45. %d. C 0.6 0.2 0.2 R 7. H 90. T 0.}\n", x, z);
printf("BALL{P %d. 120. %d. C 0. 0.5 0.1 S 120. 60. 140. T 0.}\n", x, z);
}

void tree2(){
int x, z, s;
printf("座標(x)=");scanf("%d", &x);
printf("座標(z)=");scanf("%d", &z);
printf("POLE_Y{P %d. 60. %d. C 0.5 0.1 0.1 R 6. H 120. T 0.}\n", x, z);
printf("BALL{P %d. 160. %d. C 0. 0.6 0.1 S 18. 60. 18. T 0.}\n", x, z);
}

void texmake(){
int v, x, y, z, h, i, k, a[100][4];
float c, rad, rx, ry, rz, cr, cg, cb;
printf("平面選択 (x-y):[0] (y-z):[1] (z-x):[2]=");scanf("%d", &v);
printf("開始座標(x)=");scanf("%d", &x);
printf("開始座標(y)=");scanf("%d", &y);
printf("開始座標(z)=");scanf("%d", &z);
printf("奥行き=");scanf("%d", &h);
printf("透過度=");scanf("%f", &c);
printf("色(R G B)");scanf("%f %f %f", &cr, &cg, &cb);
printf("回転角度=");scanf("%f", &rad);
if(rad!=0){printf("回転軸(x y z)=");scanf("%f %f %f", &rx, &ry, &rz);}

for(i=0;i<100;i++) {
for(k=0;k<4;k++) {printf("a[%d][%d]", i, k);scanf("%d", &a[i][k]);
  if(k==3&&a[i][0]==0&&a[i][1]==0&&a[i][2]==0&&a[i][3]==0){i=100;}
}
}
printf("\n");
for(i=0;i<100;i++) {
if(a[i][0]==0&&a[i][1]==0&&a[i][2]==0&&a[i][3]==0){i=100;}
else {
if(v==0){printf("BOX{P %d. %d. %d. C %1.1f %1.1f %1.1f S %d. %d. %d. T %1.1f", x+(a[i][2]+a[i][0])/2, y+(a[i][3]+a[i][1])/2, z+h/2, cr, cg, cb, a[i][2]-a[i][0], a[i][3]-a[i][1], h, c);}
else if(v==1){printf("BOX{P %d. %d. %d. C %1.1f %1.1f %1.1f S %d. %d. %d. T %1.1f", x+h/2, y+(a[i][3]+a[i][1])/2, z+(a[i][2]+a[i][0])/2, cr, cg, cb, h, a[i][3]-a[i][1], a[i][2]-a[i][0], c);}
else if(v==2){printf("BOX{P %d. %d. %d. C %1.1f %1.1f %1.1f S %d. %d. %d. T %1.1f", x+(a[i][2]+a[i][0])/2, y+h/2, z+(a[i][3]+a[i][1])/2, cr, cg, cb, a[i][2]-a[i][0], h, a[i][3]-a[i][1], c);}

if(rad!=0){printf(" Ro %1.1f %1.1f %1.1f %1.2f", rx, ry, rz, rad);}
printf("}\n");
}
}
}

void texexpo(){
int pa, v, x, y, z, h, i, k, a[200][4], p, q, x1, x2, y1, y2, xmax, ymax;
float c, rad, rx, ry, rz, cr, cg, cb;
printf("ヘッダ情報を入力しますか?  yes[1] no[0]");scanf("%d", &pa);
if(pa==1){
printf("平面選択 (x-y):[0] (y-z):[1] (z-x):[2]=");scanf("%d", &v);
printf("開始座標(x)=");scanf("%d", &x);
printf("開始座標(y)=");scanf("%d", &y);
printf("開始座標(z)=");scanf("%d", &z);
printf("奥行き=");scanf("%d", &h);
printf("透過度=");scanf("%f", &c);
printf("色(R G B)");scanf("%f %f %f", &cr, &cg, &cb);
printf("回転角度=");scanf("%f", &rad);
if(rad!=0){printf("回転軸(x y z)=");scanf("%f %f %f", &rx, &ry, &rz);}
}
printf("パターンサイズ(横軸)=");scanf("%d", &p);
printf("パターンサイズ(縦軸)=");scanf("%d", &q);
printf("始点座標(x1:y1)=");scanf("%d %d", &x1, &y1);
printf("終点座標(x2:y2)=");scanf("%d %d", &x2, &y2);
printf("横方向くり返し回数=");scanf("%d", &xmax);
printf("縦方向くり返し回数=");scanf("%d", &ymax);
printf("\n**********************");
if(pa==1){printf("\n10\n%d\n%d %d %d\n%d\n%1.1f\n%1.1f %1.1f %1.1f\n%1.2f", v,x,y,z,h,c,cr,cg,cb,rad);
if (rad!=0){printf(" %1.1f %1.1f %1.1f", rx, ry, rz);}
}
for(i=0;i<ymax;i++) {
for(k=0;k<xmax;k++) { printf("\n%d %d %d %d", x1+p*k, y1+q*i, x2+p*k, y2+q*i);}
}
printf("\n0 0 0 0\n0\n**********************\n");

}

------------------------------------------------------------------------------------------------------------------
「texture maker」「texture exporter」 使用マニュアル

  <texture maker>
  「texture maker」は平面を指定し、相対座標を打ち込むことで簡単に大量の直方体を
  作ることの出来るツールです。
  1.原点座標 2.奥行き 3.色、透過性、回転
  4.範囲の始点座標(原点側) 5.範囲の終点座標(原点の反対側)
  4と5は連続で入力し続けることができます。(a[i][o]=x1, a[i][1]=y1, a[i][2]=x2, a[i][3]=y2)
    0,0,0,0と打ち込むと終了します。

  <texture exporter>
  「texture exporter」は「texture maker」用のデータを出力するためのツールです。
  1.(x-y)(y-z)(z-x)平面のいずれかを選択し、原点とする座標を選択。
  2.平面からの奥行き(残りの軸の正方向)を選択。
  3.その他の情報を入力。
  4.単位面積の縦横長を入力。
  5.作りたい長方形の始点、終点座標(相対)を入力。
  6.横方向、縦方向に何回繰り返すかを入力。
  出力されたデータ(*******************に挟まれている部分)を拡張子.datで保存してください。
  これをプログラム実行時に ./~~~.out<~~~.dat とすると、自動的に変換されて出力されます。
  
  *ヘッダファイルの有無について
   ヘッダとはプログラム開始時の入力、平面、原点座標、色などの情報の部分です。
   この後に「座標データ」「終了データ」で構成されています。
   ヘッダ無しにして出力されたデータは、「座標データ」「終了データ」のみになります。  

タグ:

+ タグ編集
  • タグ:

このサイトはreCAPTCHAによって保護されており、Googleの プライバシーポリシー利用規約 が適用されます。

最終更新:2007年11月17日 20:43