文号
t14116
阅读
5022
回复
5
收藏
3
另一个纯软3D引擎的实现
2009/04/07
IP:山东
编译环境:XXXXXX 2005
代码语言:XXXXXX

当初准备用于显示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 27次下载
+500
科创币
93°
2009/04/07
支持
+2547
科创币
chiataimakro
2009/04/07
。。。
17年9个月前IP:未同步
89198
1楼
大家要具有钻研精神,不要整天抄代码。向CWOOD同志学习。
引用
评论
cwood作者
17年9个月前IP:未同步
89247
2楼
chiataimakro版好大方啊!给了这么多KCB。谢了!
引用
评论
17年9个月前IP:未同步
89540
3楼
很久没有这种贴了,上次那个3D是因为做为版主总得做些拿得出手的东西
引用
评论
17年9个月前IP:未同步
89550
4楼
很强大,下来消化一下。
本人数学不好。看起来好吃力啊。
又发现了KC里面的一位高手
引用
评论
笔记
{{note.content}}
{{n.user.username}}
{{fromNow(n.toc)}} {{n.status === noteStatus.disabled ? "已屏蔽" : ""}} {{n.status === noteStatus.unknown ? "正在审核" : ""}} {{n.status === noteStatus.deleted ? '已删除' : ''}}
  • 编辑
  • 删除
  • {{n.status === 'disabled' ? "解除屏蔽" : "屏蔽" }}
我也是有底线的