- 注册时间
- 2004-12-11
- 最后登录
- 1970-1-1
|
发表于 2007-6-29 23:53:18
|
显示全部楼层
找到了一篇,不过和LZ说的不一样
原创]新技术,通过投影变换,在星星上显示3d图形
作者:npassword
有3d编程经验的一看就懂,以下类似投影变换,将3d图形中的每个顶点,透视到屏幕平面上,再在星星的屏幕上把所有点连起来,形成3d效果,我没学过线性数学,所以有错误请大家见谅。
为适应星星的屏幕,我把世界坐标的方向改成了如图所示
其中的sbp(screen basic point)为坐标转换的重要一点,用它可以算出屏幕上的坐标.基本原理就是算出视点(相当于眼睛eye)与顶点(v)连成的空间直线方程(有三个方程),此直线交屏幕平面的点既是要在星星上显示的点,用它与sbp坐标差计算出此点在屏幕平面的相对坐标(sx,sy),再画出点之间连线即可.
10 ex=0:ey=-40:ez=-200:f=80 (这里是视点eye的坐标和焦距)
20 vx(0)=0:vy(0)=-50:vz(0)=0 (第一点的x,y,z)
30 vx(1)=0:vy(1)=0:vz(1)=-27 (第二点)
40 vx(2)=25:vy(2)=0:vz(2)=25 (.....
50 vx(3)=-25:vy(3)=0:vz(3)=25
60 goto 300
70 if peek(196)=223 then ex=ex+2:goto 300 (按d,视点坐标延x轴移动2)
80 if peek(198)=223 then ex=ex-2:goto 300 (......
90 if peek(197)=239 then ey=ey-2:goto 300
100 if peek(197)=223 then ey=ey+2:goto 300
110 if peek(196)=239 then ez=ez+2:goto 300
120 if peek(198)=239 then ez=ez-2:goto 300
130 goto 70
300 for i=0 to 3: vx=vx(i): vy=vy(i): vz=vz(i): z=ez+f (渲染4个点,存入每个点的坐标,z=ez+f就是简化的投影平面方程)
310 x=(vx-ex)*(z-ez)/(vz-ez)+ex: y=(vy-ey)*z-ez)/(vz-ez)+ey: sx=x-ex+80: sy=y-ey+40 (纯粹是考立几,前面的就是空间直线方程的两个方程,用来计算与投影平面交点的世界坐标,后面就是将世界坐标转换成投影平面相对坐标的计算,也就是在星星屏幕上的坐标)
320 if sx<1 then sx=1 (为测试而简化的部分,三维图形在星星屏幕边界会扭曲,还没想到好方法解决)
330 if sy<0 then sy=0 (同上)
340 sx(i)=sx: sy(i)=sy: next (存储该点投影变换的结果,并返回运算下一点)
350 cls: line sx(0),sy(0),sx(1),sy(1),1: line sx(0),sy(0),sx(2),sy(2),1 (运算完成,完成真正的渲染)
360 line sx(0),sy(0),sx(3),sy(3),1: line sx(1),sy(1),sx(2),sy(2),1
370 line sx(1),sy(1),sx(3),sy(3),1: line sx(2),sy(2),sx(3),sy(3),1
380 goto 70
(以上在nc2000c上测试通过,其他型号只需修改按键值)
用w,s,a,d控制视点(摄像机)上下左右,e是前进,q是后退,移动时是否找到了玩cs的感觉.
以上程序简化成只能控制投影平面上下左右平动,我正在作视角可旋转的程序,嗨,方程太复杂了,我晕.
清屏简化为cls,使得移动时闪烁太厉害,改善一下应该流畅很多.
还有如果从后往前渲染所有点,再在画每个三角形时,清除三角形内的图形,只留边框(不太会,哪位指点一下),便可以使它看起来更像一个实体.
实际上以上程序实用性不大,因为不可能同时渲染几十,几百个点,只作为技术的创新而已,当然如果谁能受到启发,用星星作出了真正的3d游戏,我绝对强烈支持!!! |
|