基础知识10镜头位置变化[转]

转载 原文为 http://www.pan3d.me/tutorial 作者 Pan3d.Me

基础知识10镜头位置变化[转]
在这个程序中我们的镜头具备了绕X轴旋转的效果了, 而我们在之前的程序中镜头角度只有angle_y在改变,

也就是只在绕着Y轴在转而以,并不能绕X轴在转。 (简单我们可以理解 镜头一般都可以向上向下,向左向右)

我们是通过MOUSE 的x,y来修改镜头的 两个偏转角值的  angle_y,angle_x,到这一步我们其本上就可以做到3D

空间里镜头成像的效果了,

一、程序解释

在这个例子中,基本的数据模型跟上一个一样的,只有镜头计算映射过程中多加了一些程序来处理

①.设计一个固定的点,用来捆定镜头

private var _focus_3d:Object={ x:0, y:0, z:0,  angle_x:0, angle_y:0, angle_z:0 } //


设定一个点 _focus_3d 用来记录这个点,然后会通过这个间来计算镜头的位置

②.计算出镜头的位置及角度(代入镜头)

private function _catch_cam(_Cam) {  //设置镜头坐标  (可以对应左上角的镜红点(运行SWF))

var view_angle_x = _focus_3d.angle_x
var view_angle_y = _focus_3d.angle_y-180
var rx = 0;
var ry = 0;
//var rz = _Cam3D._distance
var rz =_d
var tmp_angle = view_angle_x * Math.PI / 180;
var tmp_ry = ry;
ry = (Math.cos(tmp_angle) * tmp_ry – Math.sin(tmp_angle) * rz);
rz = (Math.sin(tmp_angle) * tmp_ry + Math.cos(tmp_angle) * rz);
var tmp_angle_y = view_angle_y * Math.PI / 180;
var tmp_rx = rx;
rx = (Math.cos(tmp_angle_y) * tmp_rx + Math.sin(tmp_angle_y) * rz);
rz = (Math.sin(tmp_angle_y) * tmp_rx + Math.cos(tmp_angle_y) * rz);
_Cam.x = rx + _focus_3d.x;
_Cam.y = ry + _focus_3d.y;
_Cam.z = rz + _focus_3d.z;

_Cam.angle_x = _focus_3d.angle_x;
_Cam.angle_y = _focus_3d.angle_y;

}


在这个函数的用意,是跟据 focus_3D 来算出一个镜头的位置。

在这里,为了能直观的了解程序的功能,那就得先设计 其中一个偏转角为0(angle_y,angle_x)

慢的去改变另一个角度值的变化,没有直接能用语言可以表达的,只能慢慢的去领悟。或对比最后

处到的镜头坐标来比较

③.计算3D点映射到镜头上的2D位置

public function math_change_point(_3dpoint) {
var rx = _3dpoint.x -_Cam.x
var ry = _3dpoint.y -_Cam.y
var rz = _3dpoint.z -_Cam.z

var sin_y = Math.sin(_Cam.angle_y *  Math.PI/180);
var cos_y = Math.cos(_Cam.angle_y *  Math.PI / 180);

var sin_x = Math.sin(_Cam.angle_x *  Math.PI/180);
var cos_x = Math.cos(_Cam.angle_x *  Math.PI/180);

var tmp_rx = rx;

rx = cos_y * tmp_rx – sin_y * rz;
rz = sin_y * tmp_rx + cos_y * rz;

var tmp_ry = ry;
ry = cos_x * tmp_ry – sin_x * rz;
rz = sin_x * tmp_ry + cos_x * rz;

_3dpoint.bx = rx;
_3dpoint.by = ry;
_3dpoint.bz = rz;

}


这段程序,最好是先看上一节的例子,因为上一节只对angle_y进行运算,在这里只是多加了关于

angle_x的偏转。 没必要死记,只要知到这样计算出来的结果是正确的就可以了

你可能感兴趣的:(ITeye,D语言)