「我要当老师投稿」伪3d理论
gamemaker吧
全部回复
仅看楼主
level 13
波导Lucario 楼主
gm作为著名的2d引擎,自带3d函数可能有些新手不是很会用,什么y轴颠倒之类的更是影响手感,
那么我们能不能只通过x,y和深度,来计算出这个点在屏幕上的位置呢?
2015年05月12日 15点05分 1
level 13
波导Lucario 楼主
实际上,我们一般所谓的3D,都是投影到屏幕上的画面,屏幕是2D的,所以3d场景中的物体是场景中的点,连接到眼睛的直线,与屏幕的交点就是显示的位置
2015年05月12日 15点05分 2
level 13
波导Lucario 楼主
从正上方向下看的话,假设屏幕的depth为0,点的深度为d,位置为x的话,还需要知道什么才能确定绘制的位置?
没错,需要知道视点到屏幕的距离才可以
那么这就是个简单的3角函数问题了
2015年05月12日 15点05分 3
level 13
波导Lucario 楼主
由此建立函数f3d( d,vd,vpx ) //物体深度,视角深度,视角位置
if(vd+d!=0)
{
return vpx*d/(vd+d);
}
else
{
return -1008611748;
}
2015年05月12日 15点05分 4
level 13
波导Lucario 楼主
y轴算法与x轴相同,所以理论上可以用同一个函数呢
所以最后整理一下脑中的思路
我们需要一个函数,输入位置,输入视点坐标,输入深度,即可返回绘制位置
所以绘制位置=vp-vd*(vpx-x)/(vd+d)
函数中vd是全局变量,可以直接定义成常量
之后,将这个函数整理成gm可用的函数
2015年05月12日 16点05分 5
level 13
波导Lucario 楼主
想必你应该能使用这个代码找到绘制的位置了
那么,为了更方便的绘制,你是不是应该再拥有一个代码,可以绘制不同的大小呢?
这里就介绍一下f3d_scale代码
这个代码其实主要目的是根据指定的深度来判断绘制的scale是多少,
物体越远,自然就感觉越小,但是到底是个什么程度呢,我们来看一下下面这张图
2015年05月12日 16点05分 6
level 13
波导Lucario 楼主
由图可知,距离视点2个vd的距离的一根横线,映射到屏幕上时就只有一半了,那么我们可以推断,物体在同一个视点内能看起来一样的话,距离越近则越大,正好是个反比例函数,距离1个vd时比例正好为1,2个vd时则是一半,
由此可得,scale=1/((d+vd)/vd)
2015年05月12日 16点05分 7
level 11
卧槽,吊得不行[汗]
2015年05月13日 04点05分 8
吧务
level 12
这教程牛了。
应该加精!
2015年05月13日 06点05分 9
level 13
波导Lucario 楼主
万事俱备,只欠编个obj了
现在我们来尝试编一个32x32x32的立方体如何?
首先要确定立方体的8个顶点
我们用xx[i]和yy[i]来表示的话,
就这样设定一下:
离玩家近的这四个点是0123,远的四个点是4567
依次是左上,右上,左下,右下
然后我们先只绘制直线,看看特效
首先在create来启用坐标,并且让深度随机
2015年05月14日 14点05分 10
level 13
波导Lucario 楼主
之后在step里设定每个坐标的顶点啦什么的
万一设定错了可要找半天哦,所以一定要一次写好
2015年05月14日 14点05分 11
level 13
波导Lucario 楼主
最后在draw里画一个能围成正方体的一组直线
之后在房间里随机创建一些obj,之后就能看到这样的场景:
2015年05月14日 15点05分 12
level 13
波导Lucario 楼主
本教程最后一部分:贴图
肯定有人会讲咯,我光画这么一坨东西没用啊,也不能起到高大上的视觉效果,如果6个面都能贴上图该多好呢
这时就需要纹理了
什么是纹理呢?你绘制一个图形,这图形上面可以贴上图片,这就是纹理,说白了就是绘制四边形
但是当你决定用绘制四边形来绘制3d的时候就会出现很多问题
比如,正面的图形会遮挡侧面的,用眼睛看左边的砖,左边的砖是右边压在左边上面的,右边的砖是左边压在右边上面的,如果只用1个obj来绘制的话,很难解决这个问题因为并不能使用深度
那要怎么办呢?
2015年05月14日 15点05分 13
level 13
波导Lucario 楼主
首先,设定表面并开始绘制
绘制的表面一定要是32x32的请注意!
然后就是,你需要依次绘制上,下,左,右 四个面的图案,
当然如果视点在物体的右面时,看不到左面,左面就可以不需要绘制以节约资源
2015年05月14日 15点05分 14
level 13
波导Lucario 楼主
为毛不绘制顶面呢,其实就是因为担心右侧的砖会挡住左侧的砖的最上面,因为毕竟代码执行是有顺序之分的,为了解决这个问题,我们新建一个obj,起名叫block_front
这个obj专门绘制其他所有砖砖的顶面
好的,那么同样的代码我们再绘制一次,不过这次用上with
因为我们用的是with,所以不需要担心局部变量的失效问题哦
为什么要这么做?
其实就是在所有block执行过各自的绘图代码后,最后绘制最顶面
gm中并没有draw start和draw end ,所以我们只能用物体来控制,建立好block_front之后,把他丢到屏幕的右下角就可以了,这样block_front的代码一定是最后一个执行的,自然所有block的顶面可以压住其他砖的侧面了哦。
2015年05月14日 15点05分 15
level 13
波导Lucario 楼主
然后,请尽情享受伪3d的乐趣!
(教程中可能难免有出错的地方,请谅解)
(如有任何问题,请直接联系本人)
2015年05月14日 15点05分 16
吧务
level 14
顶下
2015年05月14日 17点05分 17
level 6
GMS中解决绘制效率的一个办法:
1.常量用 pr_trianglelist 所有模型的材质均由三角形拼结而成
2.使用vertex buffer,一次性把场景中的模型,背景加载到内存
2015年05月14日 21点05分 18
level 5
顶一下波导(换头像了诶)
2015年05月15日 21点05分 19
level 3
厉害
2015年05月18日 05点05分 20
1 2 尾页