我是靠谱客的博主 神勇蜜粉,最近开发中收集的这篇文章主要介绍C++3D-1,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

前言

现在的自由度比较高的小游戏,大游戏基本上都是3d的,在看此篇博客的各位,是否也想做一个3d引擎呢?在这几篇里面,我将讲述如何用C++做一个3d引擎,用其他语言的同鞋也可以看一看这一篇,这一篇主要是讲数学推导的,话不多说,进入正题

正题

•数学推导

3d,是一个看上去非常难的项目,因为其中涉及到大量的数学推导,以及极多的代数公式,但是实际并不是这样,下面我们就来看看它的数学推导吧

首先要有一个观察者
也就是我们的屏幕
这个怎么做到呢?
我们用一个类
首先,这个观察者他要有确切的位置和观察的朝向
于是就这样一段代码

class Cam
{
    POS_3D lt; //这一个POS_3D是个结构体,大意就是三个坐标
    int af;
    int hf; //这两个指的是水平的观察朝向角度和竖直的观察朝向角度
   ... 
}

看上去很简单,对吧?
接着我们来说一说移动
就是两种嘛,一种是增量形式,一种是设置形式,也很好理解,增量形式就是把它加上去,设置形式就是直接等于

敲黑板画重点

接下来就是显示了
我们该怎么做一下呢?
首先我们要让观察者移到原点,让被观察的点也移动那么多,接着是最难的,让观察者面向x轴,让被观察的点也做同样的变换,当然不一定也面向x轴啊,我们现在来看一看,该怎么做。
首先移到原点
那让被观察的点分别减去观察者的坐标
xOy平面移动
xOz平面移动
其次旋转
把被观察的点先投影到xoy平面上,计算它在xoy平面投影的极坐标,减去之前的af,也就是水平角度,同理,把被观察的点投影到zoy,或者是你想要的地方xoz,再对它做相同的变换,但这次是减去ah,笛卡尔坐标转极坐标和极坐标转笛卡尔坐标的公式如下
r=sqrt(x2, y2)
θ =arctan(y/x)

x=rcos(θ)
y=r
sin(θ)
旋转
有了这个公式,我们可以运作了

伪代码

其它语言的同鞋可以离场了

在此仅展示由上面公式推导而来的代码的一部分

//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所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(36)

评论列表共有 0 条评论

立即
投稿
返回
顶部