加载中
加载中
表情图片
评为精选
鼓励
加载中...
分享
加载中...
文件下载
加载中...
修改排序
加载中...
另一个纯软3D引擎的实现
cwood2009/04/07软件综合 IP:山东
编译环境:VS.NET 2005
代码语言:VB.NET

当初准备用于显示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
新版本公告
~~空空如也
novakon
16年4个月前 IP:未同步
89198
大家要具有钻研精神,不要整天抄代码。向CWOOD同志学习。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
cwood作者
16年4个月前 IP:未同步
89247
chiataimakro版好大方啊!给了这么多KCB。谢了!
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
novakon
16年4个月前 IP:未同步
89540
很久没有这种贴了,上次那个3D是因为做为版主总得做些拿得出手的东西
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
hackboymzw
16年4个月前 IP:未同步
89550
很强大,下来消化一下。
本人数学不好。看起来好吃力啊。
又发现了KC里面的一位高手
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论

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

所属专业
上级专业
同级专业
插入公式
评论控制
加载中...
文号:{{pid}}
投诉或举报
加载中...
{{tip}}
请选择违规类型:
{{reason.type}}

空空如也

笔记
{{note.content}}
{{n.user.username}}
{{fromNow(n.toc)}} {{n.status === noteStatus.disabled ? "已屏蔽" : ""}} {{n.status === noteStatus.unknown ? "正在审核" : ""}} {{n.status === noteStatus.deleted ? '已删除' : ''}}
  • 编辑
  • 删除
  • {{n.status === 'disabled' ? "解除屏蔽" : "屏蔽" }}
我也是有底线的