![]() |
|
||||||||||
|
|||||
|
Регистрация: Apr 2003
Адрес: DC
Сообщений: 4,489
|
да я шучу ... гиперкуб я ещё не нарисовал, а это типа маленький пример кода работы с камерой через матрицы 4x4. Ничего вроде не усложнял. Кто не понимает маленькое пояснение. Здесь вращается исключительно камера, можете нажать ctrl+alt+v и увидеть, что координаты куба остаются неизменными.
function vector() { /* vector constructor */ this.x = arguments[0]; this.y = arguments[1]; this.z = arguments[2]; this.w = arguments[3]; } function matrix() { /* matrix constructor */ this.mat = new Array(3); this.mat[0] = [1.0, 0.0, 0.0, 0.0]; this.mat[1] = [0.0, 1.0, 0.0, 0.0]; this.mat[2] = [0.0, 0.0, 1.0, 0.0]; this.mat[3] = [0.0, 0.0, 0.0, 1.0]; } matrix.prototype.set_rotation_matrix = function() { /* set the rotation matrix around of some vector */ var tmp = 1.0-arguments[2]; var tax = tmp*arguments[0].x; var tay = tmp*arguments[0].y; var taz = tmp*arguments[0].z; this.mat[0] = [tax*arguments[0].x+arguments[2], tay*arguments[0].x-arguments[1]*arguments[0].z, taz*arguments[0].x+arguments[1]*arguments[0].y, 0.0]; this.mat[1] = [tax*arguments[0].y+arguments[1]*arguments[0].z, tay*arguments[0].y+arguments[2], taz*arguments[0].y-arguments[1]*arguments[0].x, 0.0]; this.mat[2] = [tax*arguments[0].z-arguments[1]*arguments[0].y, tay*arguments[0].z+arguments[1]*arguments[0].x, taz*arguments[0].z+arguments[2], 0.0]; this.mat[3] = [0.0, 0.0, 0.0, 1.0]; }; matrix.prototype.matrix_multiplication_3x3 = function() { /* this_matrix_3x3*matrix_3x3 */ var tmp = new matrix(); tmp.mat[0][0] = arguments[0].mat[0][0]*this.mat[0][0]+arguments[0].mat[1][0]*this.mat[0][1]+arguments[0].mat[2][0]*this.mat[0][2]; tmp.mat[0][1] = arguments[0].mat[0][1]*this.mat[0][0]+arguments[0].mat[1][1]*this.mat[0][1]+arguments[0].mat[2][1]*this.mat[0][2]; tmp.mat[0][2] = arguments[0].mat[0][2]*this.mat[0][0]+arguments[0].mat[1][2]*this.mat[0][1]+arguments[0].mat[2][2]*this.mat[0][2]; tmp.mat[1][0] = arguments[0].mat[0][0]*this.mat[1][0]+arguments[0].mat[1][0]*this.mat[1][1]+arguments[0].mat[2][0]*this.mat[1][2]; tmp.mat[1][1] = arguments[0].mat[0][1]*this.mat[1][0]+arguments[0].mat[1][1]*this.mat[1][1]+arguments[0].mat[2][1]*this.mat[1][2]; tmp.mat[1][2] = arguments[0].mat[0][2]*this.mat[1][0]+arguments[0].mat[1][2]*this.mat[1][1]+arguments[0].mat[2][2]*this.mat[1][2]; tmp.mat[2][0] = arguments[0].mat[0][0]*this.mat[2][0]+arguments[0].mat[1][0]*this.mat[2][1]+arguments[0].mat[2][0]*this.mat[2][2]; tmp.mat[2][1] = arguments[0].mat[0][1]*this.mat[2][0]+arguments[0].mat[1][1]*this.mat[2][1]+arguments[0].mat[2][1]*this.mat[2][2]; tmp.mat[2][2] = arguments[0].mat[0][2]*this.mat[2][0]+arguments[0].mat[1][2]*this.mat[2][1]+arguments[0].mat[2][2]*this.mat[2][2]; return tmp; }; matrix.prototype.vector_multiplication = function() { /* this_matrix*vector */ var tmp = new vector(0.0, 0.0, 0.0, 1.0); tmp.x = this.mat[0][0]*arguments[0].x+this.mat[0][1]*arguments[0].y+this.mat[0][2]*arguments[0].z; tmp.y = this.mat[1][0]*arguments[0].x+this.mat[1][1]*arguments[0].y+this.mat[1][2]*arguments[0].z; tmp.z = this.mat[2][0]*arguments[0].x+this.mat[2][1]*arguments[0].y+this.mat[2][2]*arguments[0].z; tmp.w = 1.0; return tmp; }; function face() { /* face constructor */ this.a = arguments[0]; this.d = arguments[0].length-1; this.face_color = arguments[1]; } face.prototype.draw = function() { arguments[0].moveTo(v[this.a[0]].rx, v[this.a[0]].ry); arguments[0].lineStyle(0, 0x000000, 100); arguments[0].beginFill(this.face_color, 100); for (var i = 1; i<=(this.d); i++) { arguments[0].lineTo(v[this.a[i]].rx, v[this.a[i]].ry, v[this.a[i+1]].rx, v[this.a[i+1]].ry); } arguments[0].endFill(); }; face.prototype.fill = function() { if (((v[this.a[1]].rx-v[this.a[0]].rx)*(v[this.a[2]].ry-v[this.a[0]].ry)-(v[this.a[1]].ry-v[this.a[0]].ry)*(v[this.a[2]].rx-v[this.a[0]].rx))<=0) { this.draw(arguments[0]); } }; /* +-----------------------------------------------------------------+ */ /* | EASY 3D CAMERA | Grigory A. Ryabov | http://www.flash.plux.ru | */ /* +-----------------------------------------------------------------+ */ _root.onLoad = function() { /* the factor for transformation radian to degrees */ rad = Math.PI/180; /* center */ center = new vector(250, 250, 0.0, 1.0); /* distance from view point to center of the World Coordinates */ distance = 500; /* initialization of a 3D cube */ /* ------------------------------------------ */ var sx = 160; var sy = 50; var sz = 160; /* initialization of the vectors */ v = new Array(); v[0] = new vector(sx, -sy, sz, 1.0); v[1] = new vector(sx, sy, sz, 1.0); v[2] = new vector(sx, sy, -sz, 1.0); v[3] = new vector(sx, -sy, -sz, 1.0); v[4] = new vector(-sx, -sy, -sz, 1.0); v[5] = new vector(-sx, sy, -sz, 1.0); v[6] = new vector(-sx, sy, sz, 1.0); v[7] = new vector(-sx, -sy, sz, 1.0); /* initialization of the faces */ f = new Array(); f[0] = new face([0, 1, 2, 3], 0x999988); f[1] = new face([5, 4, 3, 2], 0x777766); f[2] = new face([4, 5, 6, 7], 0x555544); f[3] = new face([7, 6, 1, 0], 0x333322); f[4] = new face([0, 3, 4, 7], 0x888877); f[5] = new face([6, 5, 2, 1], 0x888877); /* ------------------------------------------ */ quantity_vectors = v.length-1; quantity_faces = f.length-1; /* global axises */ x_axis = new vector(1.0, 0.0, 0.0, 1.0); y_axis = new vector(0.0, 1.0, 0.0, 1.0); z_axis = new vector(0.0, 0.0, 1.0, 1.0); /* ------------------------------------------ */ rotation_matrix = new matrix(); final_camera_matrix = new matrix(); camera_position = new vector(0.0, 0.0, -distance, 1.0); }; _root.onEnterFrame = function() { var xa = 3*rad; var ya = (Math.cos(tmp001 += 0.01)*0.5)*rad; /* rotate around global axis y */ rotation_matrix.set_rotation_matrix(y_axis, Math.sin(xa), Math.cos(xa)); final_camera_matrix = final_camera_matrix.matrix_multiplication_3x3(rotation_matrix); /* get axes of the camera */ own_x_axis = new vector(final_camera_matrix.mat[0][0], final_camera_matrix.mat[0][1], final_camera_matrix.mat[0][2], 1.0); own_y_axis = new vector(final_camera_matrix.mat[1][0], final_camera_matrix.mat[1][1], final_camera_matrix.mat[1][2], 1.0); own_z_axis = new vector(final_camera_matrix.mat[2][0], final_camera_matrix.mat[2][1], final_camera_matrix.mat[2][2], 1.0); /* rotate around own axis y */ rotation_matrix.set_rotation_matrix(own_x_axis, Math.sin(ya), Math.cos(ya)); own_y_axis = rotation_matrix.vector_multiplication(own_y_axis); own_z_axis = rotation_matrix.vector_multiplication(own_z_axis); /* finalize */ final_camera_matrix.mat[0] = [own_x_axis.x, own_x_axis.y, own_x_axis.z, own_x_axis.w]; final_camera_matrix.mat[1] = [own_y_axis.x, own_y_axis.y, own_y_axis.z, own_y_axis.w]; final_camera_matrix.mat[2] = [own_z_axis.x, own_z_axis.y, own_z_axis.z, own_z_axis.w]; /* -------------------------------------------------------- */ for (var i = 0; i<=quantity_vectors; i++) { if (v[i].z<=distance) { var tmp = new vector(v[i].x-camera_position.x, v[i].y-camera_position.y, v[i].z-camera_position.z-distance, 1.0); var tmp = final_camera_matrix.vector_multiplication(tmp); var perspective_ratio = 1/(tmp.z/distance+1); v[i].rx = center.x+tmp.x*perspective_ratio; v[i].ry = center.y-tmp.y*perspective_ratio; } } /* -------------------------------------------------------- */ _root.clear(); for (var i = 0; i<=quantity_faces; i++) { f[i].fill(_root); } }; Или смотрите исходник.
__________________
flash/flex/unity |
|
|||||
|
Уважаемый тип
|
а можно вопрос ?
"нАХ"ето всё ??? вопрос - ответ !!! ![]() |
|
|||||
|
Регистрация: Apr 2003
Адрес: DC
Сообщений: 4,489
|
Ради самоизврата.
__________________
flash/flex/unity |
![]() |
Часовой пояс GMT +4, время: 23:54. |
|
|
« Предыдущая тема | Следующая тема » |
|
|