|
|
|||||
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]); } }
__________________
...я люблю людей!.. |
|
|||||
Регистрация: 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. |
|
|||||
Регистрация: Apr 2006
Сообщений: 88
|
да, только щас заметил, kof дважды можно не объявлять )))
|
|
|||||
Цитата:
__________________
...я люблю людей!.. |
|
|||||
Et cetera
Регистрация: Sep 2002
Сообщений: 30,784
|
|
|
|||||
Регистрация: Apr 2006
Сообщений: 88
|
ну не число же символов в коде скрипта определяет его стабильность и производительность... )))
|
|
|||||
елы-палы... При чем тут все это??? Вы когда-нить видели как выглядят преобразования Лоренца в "правильной" форме? Вы представляете себе что такое генераторы группы? Что такое групповые операции? Итак, главное из того что было написано выше: перед вами - преобразования координат в матричной форме, то, как это должно быть. Дело не в том, что это коротко, дело в том что это просто. Очень просто. Но медленно. Увы. Написал чтобы поделиться опытом. Видать, зря. Не готов народ к математике...
__________________
...я люблю людей!.. |
|
|||||
Регистрация: Apr 2006
Сообщений: 88
|
согласен что это очень просто, поэтому и интересно что именно у тебя глючит ?
|
|
|||||
Et cetera
Регистрация: Sep 2002
Сообщений: 30,784
|
А кому нужна ваша математика? Юзеру? У юзера тормоза, ему это нафиг не нужно. Программерам? Может быть, но опять же -- медленно всё это работает.
|
Часовой пояс GMT +4, время: 00:23. |
|
« Предыдущая тема | Следующая тема » |
|
|