C语言伪3D制作

这篇具有很好参考价值的文章主要介绍了C语言伪3D制作。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

源码下载地址:文件下载-奶牛快传 Download |CowTransfer

(这个程序只支持EGE图形库,请下载自带EGE的redpandaDEVC++,下载地址:文件下载-奶牛快传 Download |CowTransfer,如果使用的是easyX图形库,请根据以下内容对程序进行修改。)

成品展示:

C语言伪3D制作,c语言,开发语言

1.眼睛的成像方式

如下图,用A表示物体,O表示晶状体的光心(因为晶状体的形状可变,所以用符号↕表示),l表示主光轴,眼睛会自动调焦,把点A反射的光线都会聚在A'上。

C语言伪3D制作,c语言,开发语言

下面,只留线段AA',再在图上加一个屏幕,屏幕与AA'的交点为A": 

C语言伪3D制作,c语言,开发语言

之后把屏幕后面的部分去掉,A"为光源,眼睛就会改变晶状体的形状,重新聚焦,把A"的光线聚集到A",那么可以在屏幕上用点A''表示点A: 

C语言伪3D制作,c语言,开发语言

之后,创建一个3维坐标图(为适应屏幕,所以不使用空间直角坐标系):

C语言伪3D制作,c语言,开发语言

由此可以得出A在屏幕上的x坐标为A.x*眼睛与屏幕z轴的差/(眼睛距屏幕距离+A与屏幕z轴的差),y坐标同理。(但是这样只能在一定的位置实现“3D”,而且眼睛可以很容易的判断屏幕距离)

2.代码(因为成品代码太复杂,所以换另外一个程序简解)

头文件引用:

#include<stdio.h>
#include<windows.h>
#include<graphics.h>
#include<math.h>

初始化:

main()
{
	initgraph(450,300);
	int l=500;
	int ox=(getwidth()+1)/2;
	int oy=(getheight()+1)/2;
	int oz=70;
	typedef struct cd
	{
		int x=0;
		int y=0;
	}wdot;
	wdot wpoint[8];
	VECTOR3D point[8];
	int i,j,k;
	for(i=0;i<2;i++)
	{
		for(j=0;j<2;j++)
		{
			for(k=0;k<2;k++)
			{
				point[i*4+j*2+k].x=50*pow(-1,i);
				point[i*4+j*2+k].y=50*pow(-1,j);
				point[i*4+j*2+k].z=50*pow(-1,k);
			}
		}  
	}

初始化中l为眼睛距屏幕的距离, ox和oy为屏幕中心位置坐标,oz为屏幕距坐标原点的距离,wdot类用来保存各个点在屏幕上的位置,VECTOR3D类为EGE图形库提供的3d类,用于保存3d点坐标,包含x,y,z三个float变量,如果用的是easyX,请自行定义(最好定义全局),后面三个for循环用于确定point数组中各个变量的位置,组成一个正方体。

绘制:

    while(1)
	{
		for(i=0;i<8;i++)
		{
			wpoint[i].x=ox+point[i].x*l/(l+oz-point[i].z);
			wpoint[i].y=oy+point[i].y*l/(l+oz-point[i].z);
			putpixel(wpoint[i].x,wpoint[i].y,RGB(255,255,255));
		}
		line(wpoint[0].x,wpoint[0].y,wpoint[2].x,wpoint[2].y);
		line(wpoint[0].x,wpoint[0].y,wpoint[4].x,wpoint[4].y);
		line(wpoint[2].x,wpoint[2].y,wpoint[6].x,wpoint[6].y);
		line(wpoint[4].x,wpoint[4].y,wpoint[6].x,wpoint[6].y);
		line(wpoint[0].x,wpoint[0].y,wpoint[1].x,wpoint[1].y);
		line(wpoint[1].x,wpoint[1].y,wpoint[3].x,wpoint[3].y);
		line(wpoint[2].x,wpoint[2].y,wpoint[3].x,wpoint[3].y);
		line(wpoint[3].x,wpoint[3].y,wpoint[7].x,wpoint[7].y);
		line(wpoint[6].x,wpoint[6].y,wpoint[7].x,wpoint[7].y);
		line(wpoint[5].x,wpoint[5].y,wpoint[7].x,wpoint[7].y);
		line(wpoint[5].x,wpoint[5].y,wpoint[1].x,wpoint[1].y);
		line(wpoint[5].x,wpoint[5].y,wpoint[4].x,wpoint[4].y);

用wpoint储存point对应坐标在屏幕上显示的位置,再用putpixel函数绘制点,后面的12个line函数用来绘制正方体的各个边。

旋转:

这里可以使用EGE自带的rotate_point3d_x(), rotate_point3d_y(),rotate_point3d_z()三个函数,分别为绕x,y,z轴旋转,参数格式:&VECTOR变量,旋转角度*PI/180(弧度)。

        for(i=0;i<8;i++)
		{
			rotate_point3d_z(&point[i],3);
		}
		delay_fps(10);
		cleardevice();
	}
}

easyX中没有 rotate_point3d_x(), rotate_point3d_y(),rotate_point3d_z()这三个函数,所以可以 自制turn3d_x(),turn3d_y(),turn3d_z()三个函数,输入格式:&VECTOR3D x,旋转角度

这里拿turn3d_y()来讲解:

int turn3d_y(VECTOR3D *x,float a)
{
	float tx=x->x;
	float tz=x->z;
	float ta=atan2(tx,tz)/PI*180+a;
	float r=sqrt(pow(tx,2)+pow(tz,2));
	x->x=sin(ta*PI/180)*r;
	x->z=cos(ta*PI/180)*r;
}

 首先,引用VECTOR3D变量x,旋转角度a两个参数;

然后定义tx,ty分别等于x的想坐标,x的y坐标;

之后用x的x轴,z轴和x与原点的连线构建一个二维三角形:

C语言伪3D制作,c语言,开发语言

那么就可以用math库中的三角函数逆推函数atan2()输入角x的邻边和对边,返回弧度,需要把返回值/PI*180得到角度,保存置ta,再用ta加上旋转角度a,算出旋转后的角度(PI为EGE图形库中的定值,如果没有EGE,请自定义PI,atan2()返回后的弧度/PI*180后得到的角度可以大于90度) 

然后用勾股定理a^2+b^2=c^2算出Ox,保存到r中。

再画一个半径为r的圆:

C语言伪3D制作,c语言,开发语言

那么x旋转后的位置永远都会在圆上, 所以可以根据三角函数用旋转后的角度ta和半径r求出旋转之后的位置,公式如下:

                                        x->x=sin(ta)*r;

                                        x->z=cos(ta)*r;

因为math库中的sin(),cos(),tan()函数输入的是弧度,所以要把ta*PI/180。

完整函数(最好定义全局,放在VECTOR3D类后面):文章来源地址https://www.toymoban.com/news/detail-776500.html

int turn3d_y(VECTOR3D *x,float a)
{
	float tx=x->x;
	float tz=x->z;
	float ta=atan2(tx,tz)/PI*180+a;
	float r=sqrt(pow(tx,2)+pow(tz,2));
	x->x=sin(ta*PI/180)*r;
	x->z=cos(ta*PI/180)*r;
}
int turn3d_x(VECTOR3D *x,float a)
{
	float ty=x->y;
	float tz=x->z;
	float ta=atan2(tz,ty)/PI*180+a;
	float r=sqrt(pow(ty,2)+pow(tz,2));
	x->z=sin(ta*PI/180)*r;
	x->y=cos(ta*PI/180)*r;
}
int turn3d_z(VECTOR3D *x,float a)
{
	float tx=x->x;
	float ty=x->y;
	float ta=atan2(tx,ty)/PI*180+a;
	float r=sqrt(pow(ty,2)+pow(tx,2));
	x->x=sin(ta*PI/180)*r;
	x->y=cos(ta*PI/180)*r;
}

到了这里,关于C语言伪3D制作的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 除了three.js,还有许多其他前端开发语言和库可以用于创建3D可视化大屏

    hello老铁们...本人熟悉html5,vue对bootsrap,uniapp,layui,element,vite,antd,echarts,jq响应式尤其擅长,ui设计等技能,如果ui前端工作中有遇到烦恼可私信关注评论我们共同交流进步!谢谢       随着前端技术的飞速发展,3D可视化已经成为许多应用场景中不可或缺的一部分。在

    2024年03月15日
    浏览(72)
  • Java语言开发的AI智慧导诊系统源码springboot+redis 3D互联网智导诊系统源码

    Java 语言开发的AI智慧导诊系统源码 springboot+redis 3D 互联网智导诊系统源码 智慧导诊解决盲目就诊问题,减轻分诊工作压力。降低挂错号比例,优化就诊流程,有效提高线上线下医疗机构接诊效率。可通过人体画像选择症状部位,了解对应病症信息和推荐就医科室。 智慧导诊

    2024年04月23日
    浏览(48)
  • 3D~RPG游戏的制作

    @作者 : SYFStrive @博客首页 : HomePage @创建时间 : 2022/7/29 10:00 📜: UnityRPG核心文章(代码加起来7万字🤮) 📌: 个人社区(欢迎大佬们加入) 👉: 社区链接🔗 📌: 觉得文章不错可以点点关注 👉: 专栏连接🔗 💃: 程序员每天坚持锻炼💪 🔗: 点击直接阅读文章

    2024年02月03日
    浏览(48)
  • Unity 3D子弹发射制作

    1.导入一个枪的模型,调整好枪的位置 2.点击ScifiRifle(枪)右键创建一个Crete Empty(空的物体)命名fireponint代表子弹生成的位置 3. 制作一个简易的子弹,右键3D object→spher这里我们选用spher将其命名为bulletpoint放到合适的位置 4.编写子弹发射脚本 点击Add Component→Guncontral在Asset

    2024年02月03日
    浏览(47)
  • C++如何制作3D游戏

    C++是一门强大的编程语言,它广泛应用于游戏开发、计算机图形学等领域。如果您想制作一款高质量的3D游戏,并让它在各个平台上运行,那么C++无疑是一个非常好的选择。在本文中,我们将介绍C++如何制作3D游戏的基本流程及相关工具和资源。 游戏引擎是制作游戏必不可少

    2024年02月08日
    浏览(35)
  • Html 3D旋转相册制作

     程序示例精选 Html 3D旋转相册制作 如需安装运行环境或远程调试,见文章底部微信名片,由专业技术人员远程协助! 这篇博客针对Html 3D旋转相册制作编写代码,代码整洁,规则,易读。 学习与应用推荐首选。           一、所需工具软件         二、使用步骤  

    2024年02月12日
    浏览(38)
  • 七夕节表白3d相册制作

    定位 阴影 3d转换 动画 通过定位将所有照片叠在一起,在设置默认的样式以及照片的布局,最后通过设置盒子以及照片的旋转动画来达到效果。 效果: 代码如下: 第二种是背景图+3D相册 首先看效果: html代码: CSS代码: 第3种是樱花+特效 第一步,创建html文件 css文件 js樱花

    2024年02月12日
    浏览(38)
  • AMEsim 3D动画制作流程

    准备工作: 首先确保所建模型可以正常仿真,并有仿真结果显示(后面动画对象的驱动需要使用该数据)。 新建动画: 可以单击动画图标,或单击向下箭头,这两种情况下,为当前系统创建一个新的动画。 注意: 一旦你创建了你的第一个动画,它会链接到动画图标,点击这

    2023年04月27日
    浏览(32)
  • Python功能制作之3D方块

    用python写一个黑窗口,窗口里面有一个白色的3D方块,左键按下后移动可以旋转以各个视角来看方块。 当然有需要的话,可以自己在代码中去更改颜色,直接通过RBG的参数进行更改即可。 做了两个函数: init[初始化] 和 draw_cube[绘制方块]。 如果需要旋转,将清空缓冲上面的

    2024年02月12日
    浏览(26)
  • python 制作3d立体隐藏图

    生成文件的3d图,例子: 文字: 隐藏图: 使用建议: 1、建议不用中文,因为中文太复杂,生成立体图效果不好。 2、需要指定FONT_PATH,为一个ttf文件,linux在/usr/share/fonts目录下,windows在C:WindowsFonts 3、建议字体TEXT_SIZE调大,不然不好分辨 4、指定的TEXT不要太长 5、多

    2024年01月18日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包