使用txt文本模拟obj格式的三维模型信息,及打开任意三维模型程序。

使用txt文本模拟obj格式的三维模型信息,及打开任意三维模型程序。

1,
obj格式的三维模型是Ascll码编的,计算机能识别但我们不好理解。所以这里我在这里使用txt文本去模拟obj文件储存的信息。下面的代码是一个类似maya的微型程序,可以打开任意的以txt格式储存相关信息的三维模型。
2,
txt文本内的信息如下:
4 3 6 2 4 3
0 0 1
1080 640
2 1 1
0 1 3 1 2 4 2 0 5 4 5 3
0 3 1 3 2 3 0 1 1 2 2 0
100 0 0 200 0 200 300 0 0 200 200 100
3,
逐个介绍一下:
该文本储存了一个最简单的三棱锥,对每个面,每条边,每个点分别编一个号。
4(一共4个面) 3(每个面三个边即三角面片) 6(一共6条边) 2(每条边两个顶点) 4 (一共4个顶点)3(在三维模型中每个顶点有(x,y,z)三个分量)
0 0 1(视点向量,从z轴竖直向下观察)
1080 640(画布大小)
2 1 1(几何形体内部的一个点,消隐的时候会用到)
0 1 3 1 2 4 2 0 5 4 5 3(把每个面包含哪些边逐一列出)
0 3 1 3 2 3 0 1 1 2 2 0(把每个边包含哪些点逐一列出)
100 0 0 200 0 200 300 0 0 200 200 100(把每个点的坐标逐一列出)
4,
另一个模型,是一个四棱锥,储存信息如下:
6 3 9 2 5 3
0 0 1
1080 640
2 1 1
0 1 4 1 2 5 2 3 6 0 3 7 4 5 8 6 7 8
0 4 1 4 2 4 3 4 0 1 1 2 2 3 0 3 0 2
0 0 0 0 0 300 300 0 300 300 0 0 200 200 200
5,
温馨提示:运行环境vc6.0,注意要安装好easyx,才能运行!

#include<stdio.h>
#include<graphics.h>
#include<math.h>
#include<Easyx.h>
#include<stdlib.h>
void drawline (double x1,double y1,double x2, double y2,int color)
{double x=(int)x1,y=(int)y1,dx,dy,i,p,yk;
float k;
dx=(int)x2-x1;
dy=(int)y2-y1;
if (dx==0)
{if (dy>0)
{	for (i=y1;i<=y2;i++)
{if (color==1)
putpixel(x1,i,RGB(255,0,0));
else if (color==2)
putpixel(x1,i,RGB(0,255,0));
else
putpixel(x1,i,RGB(0,0,255));
}
}
else
{	for (i=y2;i<=y1;i++)
{if (color==1)
putpixel(x1,i,RGB(255,0,0));
else if (color==2)
putpixel(x1,i,RGB(0,255,0));
else
putpixel(x1,i,RGB(0,0,255));
}
}
}
else if (dy==0)
{if (dx>0)
{	for (i=x1;i<=x2;i++)
{if (color==1)
putpixel(i,y1,RGB(255,0,0));
else if (color==2)
putpixel(i,y1,RGB(0,255,0));
else
putpixel(i,y1,RGB(0,0,255));
}
}
else
{for (i=x2;i<=x1;i++)
{if (color==1)
putpixel(i,y1,RGB(255,0,0));
else if (color==2)
putpixel(i,y1,RGB(0,255,0));
else
putpixel(i,y1,RGB(0,0,255));
}
}
}
else
{
if (dx>0)
{k=dy/dx;
for (x;x<=x2;x++)
{if (color==1)
putpixel(x,yk,RGB(255,0,0));
else if (color==2)
putpixel(x,yk,RGB(0,255,0));
else
putpixel(x,yk,RGB(0,0,255));
y=y+k;
yk=(int)y+0.5;
}
}
else
{k=-dy/dx;
for (x;x>=x2;x--)
{if (color==1)
putpixel(x,yk,RGB(255,0,0));
else if (color==2)
putpixel(x,yk,RGB(0,255,0));
else
putpixel(x,yk,RGB(0,0,255));
y=y+k;
yk=(int)y+0.5;
}}
}
}





int main ()
{int a[6],sd[3],hb[2],zx[3];
int j,m,n,k;
int *f, *l, *p,*fcc; 
FILE*fpRead=fopen("data.txt","r");//读取文件
if(fpRead==NULL)
{
return 0;
}
for(int i=0;i<6;i++)//读取面、边、点目录
{
fscanf(fpRead,"%d",&a[i]);
}
for(i=0;i<3;i++)//读取视点数据
{
fscanf(fpRead,"%d",&sd[i]);
}
for(i=0;i<2;i++)//读取画布数据
{
fscanf(fpRead,"%d",&hb[i]);
}
for(i=0;i<3;i++)//读取内点数据
{
fscanf(fpRead,"%d",&zx[i]);
}
m=a[0]*a[1];//读取面数据
f=(int*)malloc(sizeof(int)*m);
for(i=0;i<m;i++)
{
fscanf(fpRead,"%d",&f[i]);
}
m=a[2]*a[3];//读取边数据
l=(int*)malloc(sizeof(int)*m);
for(i=0;i<m;i++)
{
fscanf(fpRead,"%d",&l[i]);
}
m=a[4]*a[5];//读取点数据
p=(int*)malloc(sizeof(int)*m);
for(i=0;i<m;i++)
{
fscanf(fpRead,"%d",&p[i]);
}
m=a[0];//为面颜色分配储存空间
fcc=(int*)malloc(sizeof(int)*m);
int **fc, **li, **po; //用二级指针动态申请二维数组
m=a[0];
n=a[1];
k=0;
fc=(int**)malloc(sizeof(int*)*m);
for(i=0;i<m;i++)
fc[i]=(int*)malloc(sizeof(int)*n);
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{fc[i][j]=f[k];
k++;}
}
m=a[2];
n=a[3];
k=0;
li=(int**)malloc(sizeof(int*)*m);
for(i=0;i<m;i++)
li[i]=(int*)malloc(sizeof(int)*n);
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{li[i][j]=l[k];
k++;}
}
m=a[4];
n=a[5];
k=0;
po=(int**)malloc(sizeof(int*)*m);
for(i=0;i<m;i++)
po[i]=(int*)malloc(sizeof(int)*n);
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{po[i][j]=p[k];
k++;}
}
double **pt;//点数据转化
m=a[4];
n=a[5];
pt=(double**)malloc(sizeof(double*)*m);
for(i=0;i<m;i++)
pt[i]=(double*)malloc(sizeof(double)*n);
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{pt[i][j]=po[i][j];}
}
printf("面、边、点目录\n");//输出各类信息
for (i=0;i<6;i++)
{printf("%d  ",a[i]);}
printf("\n");
printf("视点\n");
for (i=0;i<3;i++)
{printf("%d  ",sd[i]);}
printf("\n");
printf("画板\n");
for (i=0;i<2;i++)
{printf("%d  ",hb[i]);}
printf("\n");
printf("内点\n");
for (i=0;i<3;i++)
{printf("%d  ",zx[i]);}
printf("\n");
m=a[0];
n=a[1];
printf("面节点信息\n");
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{printf("%d ",fc[i][j]);}
printf("\n");
}
m=a[2];
n=a[3];
printf("边节点信息\n");
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{printf("%d ",li[i][j]);}
printf("\n");
}
m=a[4];
n=a[5];
printf("点节点信息\n");
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{printf("%d ",po[i][j]);}
printf("\n");
}
m=a[4];
n=a[5];
printf("虚点节点信息\n");
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{printf("%lf ",pt[i][j]);}
printf("\n");
}
k=0;
int fxg1[3],fxg2[3],fx[3];
printf("数据读取完毕,输入1开始画图:\n");
scanf("%d",&k);
if (k==1)
initgraph(hb[0],hb[1]);
else
return 0;
double k1=0;
while (k1<=12.56)
{k1=k1+0.5;
for (i=0;i<a[4];i++)//画点
putpixel(pt[i][0]+300,pt[i][1]+300,RGB(255,255,255));
Sleep(1000);
for (i=0;i<a[0];i++)//消影
{fxg1[0]=pt[li[fc[i][0]][1]][0]-pt[li[fc[i][0]][0]][0];
fxg1[1]=pt[li[fc[i][0]][1]][1]-pt[li[fc[i][0]][0]][1];
fxg1[2]=pt[li[fc[i][0]][1]][2]-pt[li[fc[i][0]][0]][2];
fxg2[0]=pt[li[fc[i][1]][1]][0]-pt[li[fc[i][1]][0]][0];
fxg2[1]=pt[li[fc[i][1]][1]][1]-pt[li[fc[i][1]][0]][1];
fxg2[2]=pt[li[fc[i][1]][1]][2]-pt[li[fc[i][1]][0]][2];

fx[0]=fxg1[1]*fxg2[2]-fxg2[1]*fxg1[2];
fx[1]=fxg1[0]*fxg2[2]-fxg2[0]*fxg1[2];
fx[2]=fxg1[0]*fxg2[1]-fxg2[0]*fxg1[1];

if ((fx[0]*zx[0]+fx[1]*zx[1]+fx[2]*zx[2])>0)
{fx[0]=-fx[0];
fx[1]=-fx[1];
fx[2]=-fx[2];}
if ((fx[0]*sd[0]+fx[1]*sd[1]+fx[2]*sd[2])>0)
fcc[i]=1;
else
fcc[i]=3;
}
for (i=0;i<a[0];i++)//画不可见线(蓝色)
{if (fcc[i]==3)
{drawline(pt[li[fc[i][0]][0]][0]+300,pt[li[fc[i][0]][0]][1]+300,pt[li[fc[i][0]][1]][0]+300,pt[li[fc[i][0]][1]][1]+300,3);
drawline(pt[li[fc[i][1]][0]][0]+300,pt[li[fc[i][1]][0]][1]+300,pt[li[fc[i][0]][1]][0]+300,pt[li[fc[i][0]][1]][1]+300,3);
drawline(pt[li[fc[i][2]][0]][0]+300,pt[li[fc[i][2]][0]][1]+300,pt[li[fc[i][2]][1]][0]+300,pt[li[fc[i][2]][1]][1]+300,3);
}
else
{}}
for (i=0;i<a[0];i++)//画可见线(红色)
{if (fcc[i]==1)
{drawline(pt[li[fc[i][0]][0]][0]+300,pt[li[fc[i][0]][0]][1]+300,pt[li[fc[i][0]][1]][0]+300,pt[li[fc[i][0]][1]][1]+300,1);
drawline(pt[li[fc[i][1]][0]][0]+300,pt[li[fc[i][1]][0]][1]+300,pt[li[fc[i][0]][1]][0]+300,pt[li[fc[i][0]][1]][1]+300,1);
drawline(pt[li[fc[i][2]][0]][0]+300,pt[li[fc[i][2]][0]][1]+300,pt[li[fc[i][2]][1]][0]+300,pt[li[fc[i][2]][1]][1]+300,1);
}
else
{}}
for (i=0;i<a[4];i++)//绕Y、Z轴旋转
{pt[i][0]=(int)po[i][0]*cos(k1)-po[i][1]*sin(k1); 
pt[i][1]=(int)po[i][0]*sin(k1)+po[i][1]*cos(k1);
pt[i][0]=(int)po[i][0]*cos(k1)+po[i][2]*sin(k1);
pt[i][1]=(int)-po[i][0]*sin(k1)+po[i][2]*cos(k1);
}
Sleep(1000);
cleardevice();}
closegraph;
printf("over\n");
}

运行结果如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值