模拟《飞越星空》屏保
最近想实践总结下3D图形学的一些内容
所以,就做出了这个东西。
本来打算用C++写的,
但考虑到MFC的丑陋和C++使用GDI/GDI+的各种不方便
遂用C#实现之,以简化实现手段。
呵呵,C#是做某些实验算法/测试的不错选择!
先上效果图:
gif动画录制的效果不太好,实际程序会流畅得多。
程序界面也可以放大,全屏。
本程序可执行下载:
http://download.csdn.net/detail/stevenkylelee/4927451
本程序工程源代码下载:
http://download.csdn.net/detail/stevenkylelee/4927775
用C#的一个好处是,双缓冲的实现很简单。
不像在C++中,要先CreateXXX什么的,
创建位图,创建DC,在其上画,
最后再Bitblt到显示DC。
说明一下,我的这个程序吧。
每个白点都是一个3D向量对象,它的运算完全是3D的。
那些白点向观察者方向运动时,
逻辑上只是自减自加其Z坐标的值。
其实,对于3D,我现在也是一个初学者,
我只是按照公式简单实现了坐标的“透视变换”,“屏幕变换”而已
本程序的整体结构用的是做游戏的方式。
帧率被设置为60fps,
C#的GDI+是否能达到60fps,
我就没有测试过了。
Render方面,
当摄像机位于原点,没有旋转时,这个实现会变得很简单
而我在做程序时压根就没考虑过摄像机的问题,呵呵。
本程序核心只有2步:
1.世界坐标经过透视变换后到视平面的映射
2.用第一步的结果,转换成屏幕坐标
透视变换的公式是:
x_per = d * x0 / z0
y_per = d * x0 / z0
其实就是:
透视变换后的X坐标 = 视距 * 点的世界坐标X / 点的世界坐标Z
透视变换后的Y坐标 = 视距 * 点的世界坐标Y / 点的世界坐标Z
截图一本书上的图示吧:
其实这个公式不难理解,
基于相似三角形,
就是用视距d在视平面上的那个点 与 坐标Z的比值
来求三角形缩小后,y在视平面的位置。
大白话说就是,
想象一个三角形缩小后,
某个点从某个位置移动到另一个位置上。
如果,你下载了我的工程源代码
可以做这样一个实验,
在FrmMain.cs文件中,
把 int m_ViewDistance = 320 ;改成
int m_ViewDistance = 50;
再编译运行一下,看看会怎样。
你会发现,白点的运动速度变快了
实际上,它距离观察者较远的时候,运动是慢的,
当它距离观察者近时,运动就变快了。
这是怎么回事呢?
实际上,点的运动速度并没有改变。
修改那句代码,只是改变了视距。
”物理世界“中那些点的速度一点没有变化,
只是,观察者看到的景象变化了。
我画了一个图来分析:
从这个图可以看到。不管视距是多少
当点向你飞来,它在远处的运动,
投影到视平面上y坐标的运动轨迹,都是缓慢的
当它越靠近你,你就会感到它在你的视觉中运动越快
而视距越短就会在更大的y空间内“剧烈地”变化,
所以,修改视距320为50,就会看到好像它飞得更快了
以上是我个人浅显的认识总结和分析,
如有错误和不足,欢迎高手纠正补充
最后,谁想把这个程序改成屏保谁就搞吧
反正,我源代码都上传了
转载于:https://www.cnblogs.com/StevenKyleLee/archive/2012/12/25/3170249.html
模拟《飞越星空》屏保相关推荐
- 飞越星空屏保实现:3D数学之透视变换
最近想实践总结下3D图形学的一些内容 所以,就做出了这个东西. 本来打算用C++写的, 但考虑到MFC的丑陋和C++使用GDI/GDI+的各种不方便 遂用C#实现之,以简化实现手段. 呵呵,C#是做某 ...
- 基于Win32的不规则透明窗口(模拟win7气泡屏保)——透明气泡的实现
通过win32 API模拟透明气泡. 先看效果: 源代码下载: https://download.csdn.net/download/qq_35553864/10656109
- php气泡效果,js 模拟气泡屏保效果代码_其他特效
核心代码: var T$ = function(id) { return document.getElementById(id); } var $extend = function(des, src) ...
- 微软幽你一默,蓝屏死机屏保
还记得熟悉的蓝屏么,从Win95以来,不断的蓝屏,死机,重启,重装就一直伴随着我们的生活.一直到WinXP SP2之后,曾经熟悉的蓝屏见到的越来越少了,而在即将到来的Vista中,据称微软甚至直接更换 ...
- windows 防止屏保锁屏脚本工具
公司安全制度要求屏保时间不得大于 3 分钟,且屏保切回桌面时需要重新输入登录密码. 在不修改屏保策略的情况下,通过脚本小工具模拟按下键盘 Num 键来阻止休眠. Dim durationHour du ...
- 鸿蒙天钟壁纸,时间数字罗盘屏保
游戏概述 时间数字罗盘屏保app是一款十分热门系统安全类软件.时间数字罗盘屏保安卓最新版为广大的用户朋友提供最具个性化的手机屏保业务,可以在系统里选择你喜爱的罗盘样式,让你的手机看起来更加的高大上.时 ...
- 3D屏保: 彩色盘子
一个彩色盘子的屏保 记得小时候在电视上看过一个科普节目,由多个颜色组成的盘子,如果快速旋转起来,会看上去是白色的.于是我就写了这个屏保程序,但发现在计算机上模拟并不是这样的. "RollPl ...
- 带滚动字幕的电脑钟表屏保
一.用途 帮别人写的一个小工具,想通过投影显示时钟,再加工一下成了2.0,模拟电子看板的钟表(无技术含量仅供交流学习) 针对无插件版更新到了V3.1(可以定制文字,已发布到52论坛:和谐本帖的您可以私 ...
- 将爱心代码设为电脑屏保,俘获少女芳心,还能假装黑客大佬,在酷炫的界面中保护隐私
将爱心代码设为电脑屏保,俘获少女芳心,还能假装黑客大佬,在酷炫的界面中保护隐私 本文介绍 Hacker Screen Saver 一款开源 Windows 屏保的使用.Hacker Screen Sa ...
最新文章
- ensp删除静态路由命令_eNSP配置静态路由
- open python语言实现 pdf_使用python操作Pdf代码实现
- 错误:Subquery returns more than 1 row 表示子查询返回了多行数据
- 【技术综述】图像与CNN发家简史,集齐深度学习三巨头
- 在outlook里设置程序员的996工作属性
- vc++创建异性窗体(2)
- 奇奇seo优化软件_西藏seo关键词优化软件
- 服务器返回它们的和_无服务器有其陷阱。 这是避免它们的方法。
- httppostedfilebase.saveas后文件被占用_文件过多时ls命令为什么会卡住?
- 华为vrrp默认优先级_华为VRRP综合配置
- 【算法系列学习】Dijkstra单源最短路 [kuangbin带你飞]专题四 最短路练习 A - Til the Cows Come Home...
- 销傲销售过程GSP管理系统功能概述
- wpf 客户端 添加qq客服咨询
- python中的上一步和下一步快捷键
- delete 和 delete []的真正区别+析构函数
- 路由器、交换机设备管理
- HTML5 新增API学习总结
- 【计组期末复习】机器周期和时钟周期、控制单元的功能:取指周期的微操作命令、取数指令的微操作、存数周期的微操作
- SVM分类器中损失函数梯度求法及理解
- 复习中国近现代史纲要--“政治编年史”