![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Нужно кое-что крутануть, но не относительно 0, а относительно pivotPoint в Хелпе сказано
appendRotation(degrees:Number, axis:Vector3D, pivotPoint:Vector3D = null):void Appends an incremental rotation to a Matrix3D object. package {
import flash.geom.*;
import __AS3__.vec.*;
import flash.display.*;
import flash.events.*;
public class Main extends MovieClip {
private var pointS:Vector.<Vector3D>,
mat3D:Matrix3D,
myPivotPoint:Vector3D,
i:int;
public function Main() {
x = 200;
y = 200;
pointS = new Vector.<Vector3D>();
pointS[0] = new Vector3D( 0, 0, 0);
pointS[1] = new Vector3D( 100, 0, 0);
pointS[2] = new Vector3D( 100, 100, 0);
pointS[3] = new Vector3D( 0, 100, 0);
mat3D = new Matrix3D();
myPivotPoint = new Vector3D( 50, 50, 50);
mat3D.appendRotation(1, Vector3D.Z_AXIS,myPivotPoint);
addEventListener(Event.ENTER_FRAME, enterFrameFunc);
}
private function enterFrameFunc(evt:Event):void {
setGr();
for (i = 0; i < 4; i++) {
pointS[i]=mat3D.deltaTransformVector(pointS[i]);
showPoint(pointS[i]);
}
}
private function showPoint(_v:Vector3D):void {
graphics.drawCircle(_v.x, _v.y, 5);
}
private function setGr():void {
graphics.clear();
graphics.beginFill(0);
}
}
}
|
|
|||||
|
Регистрация: Nov 2005
Сообщений: 1,155
|
А вы перспективную проекцию задействовали для объекта трансформации?
|
|
|||||
|
>>А вы перспективную проекцию задействовали для объекта трансформации?
Собственно проекция тут меня не очень интерисует http://murmadillo.tut.su/m/Car3Doc.swf четвертый кубик должен вращаться относительно своего центра, я локализовал проблему и которая находится в pivotPoint Я так понял pivotPoint к векторам на самом деле отношения не имеет, а имеет только к sprite и пр. дисплей объектам, там она работет, но метод deltaTransformVector возвращает никуда не применимый Vector3D. Прийдется опять юзать синусы, косинусы, и Пи, без Пи никуда даже в 10 плеере. Последний раз редактировалось Alex Lexcuk; 18.02.2009 в 00:13. |
|
|||||
package {
import flash.geom.*;
import __AS3__.vec.*;
import flash.display.*;
import flash.events.*;
public class Main extends MovieClip {
private var pointS:Vector.<Vector3D>,
mat3D:Matrix3D,
myPivotPoint:Vector3D,
i:int;
public function Main() {
x = 200;
y = 200;
pointS = new Vector.<Vector3D>();
pointS[0] = new Vector3D( 0, 0, 0);
pointS[1] = new Vector3D( 100, 0, 0);
pointS[2] = new Vector3D( 100, 100, 0);
pointS[3] = new Vector3D( 0, 100, 0);
mat3D = new Matrix3D();
myPivotPoint = new Vector3D( 50, -50, 0);
mat3D.appendRotation(1, new Vector3D(0,0,3),myPivotPoint);
addEventListener(Event.ENTER_FRAME, enterFrameFunc);
}
private function enterFrameFunc(evt:Event):void {
setGr();
for (i = 0; i < 4; i++) {
pointS[i]=mat3D.transformVector(pointS[i]);
showPoint(pointS[i]);
}
}
private function showPoint(_v:Vector3D):void {
graphics.drawCircle(_v.x, _v.y, 5);
}
private function setGr():void {
graphics.clear();
graphics.beginFill(0);
}
}
}
если поствавить myPivotPoint становится до фонаря, улетает в непонятном направлении. |
|
|||||
|
Регистрация: Mar 2006
Адрес: Odessa
Сообщений: 157
|
Насклько я понял, этот второй параметр - ось, вокруг которой мы будем вращать. И этот вектор должен быть нормализированным.
__________________
Не всех война убила - многих покалечила |
|
|||||
|
>>normalize() 8]
Делает из вектора вида ( 12, 100, 128) наподобие такого (0,0.32,0.324234) Тоесть приравнивает один параметр к 0, и вектор 0,0,3 в нормализации не нуждается, т.к. он и так нормальный. >>или (0,0,1) вместо (0,0,2) Пришли к тому с чего начинали т.к. в первом посте Vector3D.Z_AXIS и есть то-же самое что и (0,0,1) - не работает, но раз уж не получается с pivotPoint, то можно сделать коррекцю и все будет работать. package {
import flash.geom.*;
import __AS3__.vec.*;
import flash.display.*;
import flash.events.*;
public class Main extends MovieClip {
private var pointS:Vector.<Vector3D>,
mat3D:Matrix3D,
myPivotPoint:Vector3D,
xyMoveVec:Vector3D,
i:int;
public function Main() {
pointS = new Vector.<Vector3D>();
pointS[0] = new Vector3D( 0, 0, 0);
pointS[1] = new Vector3D( 100, 0, 0);
pointS[2] = new Vector3D( 100, 100, 0);
pointS[3] = new Vector3D( 0, 100, 0);
mat3D = new Matrix3D();
myPivotPoint = new Vector3D( 50, 50, 0);
xyMoveVec = new Vector3D( 200, 200, 0);
for (i=0;i<4;i++) pointS[i].incrementBy(xyMoveVec);//передвинуть точки объекта
myPivotPoint.incrementBy(xyMoveVec);//передвинуть точку ротации
mat3D.appendRotation(1, new Vector3D( 0, 0, 1));
addEventListener(Event.ENTER_FRAME, enterFrameFunc);
}
private function enterFrameFunc(evt:Event):void {
setGr();
for (i = 0; i < 4; i++) {
pointS[i].decrementBy(myPivotPoint);//вычитание векторов
pointS[i]=mat3D.transformVector(pointS[i]);
pointS[i].incrementBy(myPivotPoint);//сложение векторов
showPoint(pointS[i]);
}
}
private function showPoint(_v:Vector3D):void {
graphics.drawCircle(_v.x, _v.y, 5);
}
private function setGr():void {
graphics.clear();
graphics.beginFill(0);
}
}
}
И точки квадратика вращаются относительно myPivotPoint как было задумано. PS. может как-то я неправильно понимаю понятие вектор и от этого получаются неправильные результаты вращения, т.к. точки которые я таким образом вращаю, возможно не есть вектора. |
|
|||||
|
Регистрация: Mar 2006
Адрес: Odessa
Сообщений: 157
|
Пример из хелпа:
"Одним из способов вращения экранного объекта вокруг определенной точки относительно его расположения является настройка перемещения объекта в заданную точку, вращение объекта с использованием метода appendRotation() и обратное перемещение объекта а исходное положение. В следующем примере трехмерный экранный объект myObject осуществляет вращение по оси y вокруг точки с координатами (10,10,0)."
__________________
Не всех война убила - многих покалечила |
![]() |
![]() |
Часовой пояс GMT +4, время: 03:09. |
|
|
« Предыдущая тема | Следующая тема » |
|
|