另一个纯软3D引擎的实现
cwood2009/04/07软件综合 IP:山东
编译环境:XXXXXT 2005
代码语言:XXXXXT

当初准备用于显示3D电子地图用,后来项目取消,权当练了练手。
速度呢——在有光照强度无纹理渲染2000个三角面的情况下可以达到10以上的帧率,普通3D地图处理足够用了。

核心算法:
1、快速开平方算法:
使用的是Quake里面的快速开平方根算法。
sqrt.jpg
这是C++的托管算法:
        float CWOOD::Math::Sqrt( float x ) {
            long i;
            float y, r;

            y = x * 0.5f;
            i=*(long*)&x;
            i = 0x5f3759df - ( i >> 1 );
            r=*(float*)&i;
            r = r * ( 1.5f - r * r * y );
            return x*r;
        }
这是C++的非托管算法:
        static float ReciprocalSqrt( float x ) {
            long i;
            float y, r;

            y = x * 0.5f;
            i=*(long*)&x;
            i = 0x5f3759df - ( i >> 1 );
            r=*(float*)&i;
            r = r * ( 1.5f - r * r * y );
            return r;
        }

        static float Sqrt( float x ) {
            long i;
            float y, r;

            y = x * 0.5f;
            i=*(long*)&x;
            i = 0x5f3759df - ( i >> 1 );
            r=*(float*)&i;
            r = r * ( 1.5f - r * r * y );
            return x*r;
        }

        float QuickSqrt( float x ) {
            float d;
            _asm
            {
                mov eax,x;
                sub eax,0x3f800000;
                sar eax,1;
                add eax,0x3f800000;
                mov d,eax;
            }
            return d;
        }

2、三角函数的SIN和COS用的是查表法,虽然精度低,但效率是自带算法的好几倍。
3、3D投影到2D算法:
   实际上非常简单:
   假设3D坐标平面中Z轴指向观察者。
   假设2D坐标为标准的笛卡尔坐标系,坐标中心位于观察窗平面中心呢,观察窗平面尺寸为(sw,sh)。
   设f为相机与视平面的距离。
   设d为3D空间中的一个点(x,y,z)则
   根据透视原理,设s为放大率,则点d在2D屏幕上的投影的放大率为:s=fl/(fl-z)注意z>=fl则不绘制。
   则点d在2D平面上的投影D为:
   Dx=dx * scale + sw/2
      Dy=dy * scale + sh/2

      这样就构建好一个3D投影系统。

4、矩阵及其他数学算法:
   代码太多,包括在附件中,有兴趣的可以下载玩玩。
math.jpg

上图:

投影测试1:
3D0.jpg
投影测试2(后面的小圆圈是2D坐标):
3D3.jpg
圆球做的光照测试模型:
3D1.jpg
曲面做的光照测试模型:
3D2.jpg
下载地址:
attachment icon 3DTest New.rar 679.41KB RAR 24次下载
+500  科创币    93°    2009/04/07 支持
+2547  科创币    chiataimakro    2009/04/07 。。。
来自:计算机科学 / 软件综合
5
已屏蔽 原因:{{ notice.reason }}已屏蔽
{{notice.noticeContent}}
~~空空如也
novakon
15年10个月前 IP:未同步
89198
大家要具有钻研精神,不要整天抄代码。向CWOOD同志学习。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
cwood作者
15年10个月前 IP:未同步
89247
chiataimakro版好大方啊!给了这么多KCB。谢了!
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
novakon
15年10个月前 IP:未同步
89540
很久没有这种贴了,上次那个3D是因为做为版主总得做些拿得出手的东西
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
hackboymzw
15年10个月前 IP:未同步
89550
很强大,下来消化一下。
本人数学不好。看起来好吃力啊。
又发现了KC里面的一位高手
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论

想参与大家的讨论?现在就 登录 或者 注册

所属专业
上级专业
同级专业
cwood
进士 笔友
文章
7
回复
114
学术分
0
2007/12/29注册,4年2个月前活动
暂无简介
主体类型:个人
所属领域:无
认证方式:邮箱
IP归属地:未同步
文件下载
加载中...
{{errorInfo}}
{{downloadWarning}}
你在 {{downloadTime}} 下载过当前文件。
文件名称:{{resource.defaultFile.name}}
下载次数:{{resource.hits}}
上传用户:{{uploader.username}}
所需积分:{{costScores}},{{holdScores}}下载当前附件免费{{description}}
积分不足,去充值
文件已丢失

当前账号的附件下载数量限制如下:
时段 个数
{{f.startingTime}}点 - {{f.endTime}}点 {{f.fileCount}}
视频暂不能访问,请登录试试
仅供内部学术交流或培训使用,请先保存到本地。本内容不代表科创观点,未经原作者同意,请勿转载。
音频暂不能访问,请登录试试
支持的图片格式:jpg, jpeg, png
插入公式
评论控制
加载中...
文号:{{pid}}
投诉或举报
加载中...
{{tip}}
请选择违规类型:
{{reason.type}}

空空如也

加载中...
详情
详情
推送到专栏从专栏移除
设为匿名取消匿名
查看作者
回复
只看作者
加入收藏取消收藏
收藏
取消收藏
折叠回复
置顶取消置顶
评学术分
鼓励
设为精选取消精选
管理提醒
编辑
通过审核
评论控制
退修或删除
历史版本
违规记录
投诉或举报
加入黑名单移除黑名单
查看IP
{{format('YYYY/MM/DD HH:mm:ss', toc)}}