Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Архив Flasher.ru > Обсуждение > Flash-арт

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему  
Старый 07.12.2003, 17:18
nuran вне форума Посмотреть профиль Отправить личное сообщение для nuran Найти все сообщения от nuran
  № 1  
nuran

Регистрация: 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);
}
};

Или смотрите исходник.
Вложения
Тип файла: zip 4d_cube.zip (10.2 Кб, 97 просмотров)
__________________
flash/flex/unity

Старый 07.12.2003, 20:36
webmaster IL вне форума Посмотреть профиль Отправить личное сообщение для webmaster IL Посетить домашнюю страницу webmaster IL Найти все сообщения от webmaster IL
  № 2  
webmaster IL
Уважаемый тип
 
Аватар для webmaster IL

Регистрация: Aug 2003
Адрес: в НСКе
Сообщений: 2,880
Отправить сообщение для webmaster IL с помощью ICQ Отправить сообщение для webmaster IL с помощью MSN
а можно вопрос ?

"нАХ"ето всё ??? вопрос - ответ !!!

Старый 08.12.2003, 06:53
nuran вне форума Посмотреть профиль Отправить личное сообщение для nuran Найти все сообщения от nuran
  № 3  
nuran

Регистрация: Apr 2003
Адрес: DC
Сообщений: 4,489
Ради самоизврата.
__________________
flash/flex/unity

Создать новую тему   Часовой пояс GMT +4, время: 23:54.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 23:54.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.