概述
前言
现在的自由度比较高的小游戏,大游戏基本上都是3d的,在看此篇博客的各位,是否也想做一个3d引擎呢?在这几篇里面,我将讲述如何用C++做一个3d引擎,用其他语言的同鞋也可以看一看这一篇,这一篇主要是讲数学推导的,话不多说,进入正题
正题
•数学推导
3d,是一个看上去非常难的项目,因为其中涉及到大量的数学推导,以及极多的代数公式,但是实际并不是这样,下面我们就来看看它的数学推导吧
首先要有一个观察者
也就是我们的屏幕
这个怎么做到呢?
我们用一个类
首先,这个观察者他要有确切的位置和观察的朝向
于是就这样一段代码
class Cam
{
POS_3D lt; //这一个POS_3D是个结构体,大意就是三个坐标
int af;
int hf; //这两个指的是水平的观察朝向角度和竖直的观察朝向角度
...
}
看上去很简单,对吧?
接着我们来说一说移动
就是两种嘛,一种是增量形式,一种是设置形式,也很好理解,增量形式就是把它加上去,设置形式就是直接等于
敲黑板画重点
接下来就是显示了
我们该怎么做一下呢?
首先我们要让观察者移到原点,让被观察的点也移动那么多,接着是最难的,让观察者面向x轴,让被观察的点也做同样的变换,当然不一定也面向x轴啊,我们现在来看一看,该怎么做。
首先移到原点
那让被观察的点分别减去观察者的坐标
其次旋转
把被观察的点先投影到xoy平面上,计算它在xoy平面投影的极坐标,减去之前的af,也就是水平角度,同理,把被观察的点投影到zoy,或者是你想要的地方xoz,再对它做相同的变换,但这次是减去ah,笛卡尔坐标转极坐标和极坐标转笛卡尔坐标的公式如下
r=sqrt(x2, y2)
θ =arctan(y/x)
x=rcos(θ)
y=rsin(θ)
有了这个公式,我们可以运作了
伪代码
其它语言的同鞋可以离场了
在此仅展示由上面公式推导而来的代码的一部分
//Virtual move camera to origin
cd.x-=lt.x;
cd.y-=lt.y;
cd.z-=lt.z;
//Whirl the camera to zOx
double thf=atan(cd.y/cd.x);
double rf=sqrt(cd.x*cd.x+cd.y*cd.y);
thf-=af;
double tx=rf*cos(thf);
cd.y=rf*sin(thf);
//Whirl the camera to x
double thh=atan(cd.z/cd.x);
double rh=sqrt(cd.x*cd.x+cd.z*cd.z);
thh-=ah;
cd.x=(rh*cos(thh)+tx)/2;
cd.x/=2;
cd.z=rh*sin(thh);
//Find a best line with the dot and origin
//z=z_0*x/x_0 y=y_0*x/x_0
POS re;
re.x=cd.y*0.5/cd.x;//This is a function about that(Look up) 0.5 is screen x pos. Screen is perpendicular to x.
re.y=cd.z*0.5/cd.x;
return re;
cd是此函数传入的参数
下一篇就开始正式地封装Cam类了
奥力给
彩蛋:
最后
以上就是神勇蜜粉为你收集整理的C++3D-1的全部内容,希望文章能够帮你解决C++3D-1所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复