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

Вернуться   Форум Flasher.ru > Flash > ActionScript 1.0/2.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 07.05.2006, 02:32
K.A.T.A.F.A.L.K.E.R вне форума Посмотреть профиль Отправить личное сообщение для K.A.T.A.F.A.L.K.E.R Найти все сообщения от K.A.T.A.F.A.L.K.E.R
  № 1  
Ответить с цитированием
K.A.T.A.F.A.L.K.E.R
 
Аватар для K.A.T.A.F.A.L.K.E.R

Регистрация: Jul 2005
Адрес: Go, Ukraine!
Сообщений: 787
Отправить сообщение для K.A.T.A.F.A.L.K.E.R с помощью ICQ
По умолчанию 3D engine

Вот набрался наглости написать "умный" 3D-мотор. Умность заключалась в минимуме долботни с углами - заданы матрицы поворота и дальше все действия с радиус-векторами - это умножение их на эти матрицы. Вообщем, получилось. Но глючит. Жаль, хорошая идея загублена нерезиновостью процессоров

Код:
class com.featherysoft.vampire.d3.Transform {
	
	static private var c:Function = Math.cos;
	static private var s:Function = Math.sin;
	static private function is(arg:Number):Number {
		return -s(arg);
	}	
	static private function o(arg:Number):Number {
		return 1;
	}
	static private function z(arg:Number):Number {
		return 0;
	}
	static private var rotationMatrix:Array = [
		[[o,z,z],[z,c,s],[z,is,c]],
		[[c,z,s],[z,o,z],[is,z,c]],
		[[c,s,z],[is,c,z],[z,z,o]]
	];
	static private function multiply(index:Number,v:Vector,angle:Number):Array {
		var result:Array = [];
		for(var i:Number=0; i<3; i++){
			result[i] = 0;
			for(var j:Number=0; j<3; j++){
				result[i]+=v.vector[j]*rotationMatrix[index][i][j](angle);
			}
		}
		return result;
	}
	static public function rotate(v:Vector,angle:Array):Void {
		for(var i:Number=0; i<3; i++)
			v.vector = multiply(i,v,angle[i]);
	}
}
Код:
class com.featherysoft.vampire.d3.Vector {
	public var vector:Array;
	
	public function Vector(c1:Number,c2:Number,c3:Number) {
		if(c1==undefined || isNaN(c1)) c1=0;
		if(c2==undefined || isNaN(c2)) c2=0;
		if(c3==undefined || isNaN(c3)) c3=0;
		
		this.vector = [c1,c2,c3];
	}
}
__________________
...я люблю людей!..

Старый 08.05.2006, 02:53
orangeline вне форума Посмотреть профиль Отправить личное сообщение для orangeline Найти все сообщения от orangeline
  № 2  
Ответить с цитированием
orangeline

Регистрация: Apr 2006
Сообщений: 88
Код:
function create3DObject(mc:MovieClip, points:Array, lineSt:Object, fillSt:Object, transformObject:Object):Void {
var kof:Number = 2*Math.SQRT2;
	function Draw(clip:MovieClip, points:Array, lineSt:Object):Void {
		clip.lineStyle(lineSt.thickness, lineSt.rgb, lineSt.alpha);
		var points_length:Number = points.length;
		var kof:Number = 2*Math.SQRT2;
		for (var i = 0; i<points_length; i++) {
			clip.beginFill(fillSt.rgb, fillSt.alpha);
			clip.moveTo((points[i][0][0]+points[i][0][2]/kof), (points[i][0][1]-points[i][0][2]/kof));
			var numb_points:Number = points[i].length;
			for (var j = 1; j<numb_points; j++) {
				clip.lineTo(points[i][j][0]+points[i][j][2]/kof, points[i][j][1]-points[i][j][2]/kof);
			}
			clip.lineTo(points[i][0][0]+points[i][0][2]/kof, points[i][0][1]-points[i][0][2]/kof);
			clip.endFill();
		}
	}
	function matrMult(a:Array, b:Array):Array {
		var matrix:Array = [[], [], [], []];
		for (var i = 0; i<4; i++) {
			for (var j = 0; j<4; j++) {
				matrix[i][j] = a[i][0]*b[0][j]+a[i][1]*b[1][j]+a[i][2]*b[2][j]+a[i][3]*b[3][j];
			}
		}
		return matrix;
	}
	function createTransform(points:Array, transformObject:Object):Array {
		var tr:Object = transformObject;
		if (tr.Shift == undefined && tr.scale == undefined && tr.rotation == undefined) {
			return points;
		}
		var matrix:Array = [[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]];
		if (tr.Shift[0]*tr.Shift[1]*tr.Shift[2]>0) {
			var shiftMatrix:Array = [[1, 0, 0, tr.scale[0]], [0, 1, 0, tr.scale[1]], [0, 0, 1, tr.scale[2]], [0, 0, 0, 1]];
			matrix = matrMult(matrix, shiftMatrix);
		}
		if (tr.scale[0]*tr.scale[1]*tr.scale[2]>0) {
			var scaleMatrix:Array = [[tr.scale[0], 0, 0, 0], [0, tr.scale[1], 0, 0], [0, 0, tr.scale[2], 0], [0, 0, 0, 1]];
			matrix = matrMult(matrix, scaleMatrix);
		}
		if (tr.rotation[0]*tr.rotation[0]>0) {
			var phi:Number = tr.rotation[0]/180*Math.PI;
			var rotationMatrixX:Array = [[1, 0, 0, 0], [0, Math.cos(phi), -Math.sin(phi), 0], [0, Math.sin(phi), Math.cos(phi), 0], [0, 0, 0, 1]];
			matrix = matrMult(matrix, rotationMatrixX);
		}
		if (tr.rotation[1]*tr.rotation[1]>0) {
			var psi:Number = tr.rotation[1]/180*Math.PI;
			var rotationMatrixY:Array = [[Math.cos(psi), 0, Math.sin(psi), 0], [0, 1, 0, 0], [-Math.sin(psi), 0, Math.cos(psi), 0], [0, 0, 0, 1]];
			matrix = matrMult(matrix, rotationMatrixY);
		}
		if (tr.rotation[2]*tr.rotation[2]>0) {
			var thi:Number = tr.rotation[2]/180*Math.PI;
			var rotationMatrixZ:Array = [[Math.cos(thi), -Math.sin(thi), 0, 0], [Math.sin(thi), Math.cos(thi), 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]];
			matrix = matrMult(matrix, rotationMatrixZ);
		}
		var new_points:Array = [];
		var points_length = points.length;
		for (var i = 0; i<points_length; i++) {
			new_points[i] = [];
			var points_i_length:Number = points[i].length;
			for (var j = 0; j<points_i_length; j++) {
				var np:Array = new_points[i][j]=[];
				var op:Array = points[i][j];
				np[0] = matrix[0][0]*op[0]+matrix[0][1]*op[1]+matrix[0][2]*op[2]+matrix[0][3];
				np[1] = matrix[1][0]*op[0]+matrix[1][1]*op[1]+matrix[1][2]*op[2]+matrix[1][3];
				np[2] = matrix[2][0]*op[0]+matrix[2][1]*op[1]+matrix[2][2]*op[2]+matrix[2][3];
			}
		}
		return new_points;
	}
	var trans_points:Array = createTransform(points, transformObject);
	Draw(mc, trans_points, lineSt);
}
сиди изучай


Последний раз редактировалось Nirth; 08.05.2006 в 02:55.
Старый 08.05.2006, 02:53
orangeline вне форума Посмотреть профиль Отправить личное сообщение для orangeline Найти все сообщения от orangeline
  № 3  
Ответить с цитированием
orangeline

Регистрация: Apr 2006
Сообщений: 88
да, только щас заметил, kof дважды можно не объявлять )))

Старый 08.05.2006, 13:08
K.A.T.A.F.A.L.K.E.R вне форума Посмотреть профиль Отправить личное сообщение для K.A.T.A.F.A.L.K.E.R Найти все сообщения от K.A.T.A.F.A.L.K.E.R
  № 4  
Ответить с цитированием
K.A.T.A.F.A.L.K.E.R
 
Аватар для K.A.T.A.F.A.L.K.E.R

Регистрация: Jul 2005
Адрес: Go, Ukraine!
Сообщений: 787
Отправить сообщение для K.A.T.A.F.A.L.K.E.R с помощью ICQ
Цитата:
Сообщение от orangeline
сиди изучай
ты это вообще к чему? Мой пример реально _работает_! А теперь сравни количество кода. Для тех кто не понял: я попытался сделать бездумный движок, который сам бы делал все вычисления. Он работает, но глючит. Не справляется флеш с умножением матриц...
__________________
...я люблю людей!..

Старый 08.05.2006, 13:25
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 5  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,784
гм, кажется у меня было ещё короче =))
например: http://etcs.ru/?kernel#stuff/irss
(давно это было)

Старый 08.05.2006, 16:08
orangeline вне форума Посмотреть профиль Отправить личное сообщение для orangeline Найти все сообщения от orangeline
  № 6  
Ответить с цитированием
orangeline

Регистрация: Apr 2006
Сообщений: 88
ну не число же символов в коде скрипта определяет его стабильность и производительность... )))

Старый 08.05.2006, 17:38
K.A.T.A.F.A.L.K.E.R вне форума Посмотреть профиль Отправить личное сообщение для K.A.T.A.F.A.L.K.E.R Найти все сообщения от K.A.T.A.F.A.L.K.E.R
  № 7  
Ответить с цитированием
K.A.T.A.F.A.L.K.E.R
 
Аватар для K.A.T.A.F.A.L.K.E.R

Регистрация: Jul 2005
Адрес: Go, Ukraine!
Сообщений: 787
Отправить сообщение для K.A.T.A.F.A.L.K.E.R с помощью ICQ
елы-палы... При чем тут все это??? Вы когда-нить видели как выглядят преобразования Лоренца в "правильной" форме? Вы представляете себе что такое генераторы группы? Что такое групповые операции? Итак, главное из того что было написано выше: перед вами - преобразования координат в матричной форме, то, как это должно быть. Дело не в том, что это коротко, дело в том что это просто. Очень просто. Но медленно. Увы. Написал чтобы поделиться опытом. Видать, зря. Не готов народ к математике...
__________________
...я люблю людей!..

Старый 08.05.2006, 17:56
iNils вне форума Посмотреть профиль Отправить личное сообщение для iNils Посетить домашнюю страницу iNils Найти все сообщения от iNils
  № 8  
Ответить с цитированием
iNils
Негуру
 
Аватар для iNils

администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,879
Записей в блоге: 7
А разве в 8-ке нет класса Matrix?
__________________
(и)Нильс.ru | Плагины для FlashDevelop

Старый 08.05.2006, 19:07
orangeline вне форума Посмотреть профиль Отправить личное сообщение для orangeline Найти все сообщения от orangeline
  № 9  
Ответить с цитированием
orangeline

Регистрация: Apr 2006
Сообщений: 88
согласен что это очень просто, поэтому и интересно что именно у тебя глючит ?

Старый 08.05.2006, 19:12
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 10  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,784
А кому нужна ваша математика? Юзеру? У юзера тормоза, ему это нафиг не нужно. Программерам? Может быть, но опять же -- медленно всё это работает.

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

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

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


 


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


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