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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 17.02.2009, 21:47
Alex Lexcuk вне форума Посмотреть профиль Отправить личное сообщение для Alex Lexcuk Посетить домашнюю страницу Alex Lexcuk Найти все сообщения от Alex Lexcuk
  № 1  
Ответить с цитированием
Alex Lexcuk

блогер
Регистрация: Mar 2008
Адрес: Донецк_city
Сообщений: 1,094
Записей в блоге: 5
По умолчанию Matrix3D как использовать в appendRotation параметр pivotPoint

Нужно кое-что крутануть, но не относительно 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);
		}
	}
}
Однако точки вертятся относительно 0, а надо относительно myPivotPoint, как же заюзать myPivotPoint?

Старый 17.02.2009, 23:19
flash33 вне форума Посмотреть профиль Отправить личное сообщение для flash33 Найти все сообщения от flash33
  № 2  
Ответить с цитированием
flash33
 
Аватар для flash33

Регистрация: Nov 2005
Сообщений: 1,155
А вы перспективную проекцию задействовали для объекта трансформации?

Старый 18.02.2009, 00:04
Alex Lexcuk вне форума Посмотреть профиль Отправить личное сообщение для Alex Lexcuk Посетить домашнюю страницу Alex Lexcuk Найти все сообщения от Alex Lexcuk
  № 3  
Ответить с цитированием
Alex Lexcuk

блогер
Регистрация: Mar 2008
Адрес: Донецк_city
Сообщений: 1,094
Записей в блоге: 5
>>А вы перспективную проекцию задействовали для объекта трансформации?

Собственно проекция тут меня не очень интерисует

http://murmadillo.tut.su/m/Car3Doc.swf

четвертый кубик должен вращаться относительно своего центра, я локализовал проблему и которая находится в pivotPoint
Я так понял pivotPoint к векторам на самом деле отношения не имеет, а имеет только к sprite и пр. дисплей объектам, там она работет, но метод deltaTransformVector возвращает никуда не применимый Vector3D.
Прийдется опять юзать синусы, косинусы, и Пи, без Пи никуда даже в 10 плеере.


Последний раз редактировалось Alex Lexcuk; 18.02.2009 в 00:13.
Старый 18.02.2009, 00:44
TERRORist вне форума Посмотреть профиль Отправить личное сообщение для TERRORist Найти все сообщения от TERRORist
  № 4  
Ответить с цитированием
TERRORist
 
Аватар для TERRORist

блогер
Регистрация: Jun 2005
Адрес: RU
Сообщений: 1,540
Записей в блоге: 12
странно, у меня все работало с Pivot Point. В моем случае.

Старый 18.02.2009, 01:02
Alex Lexcuk вне форума Посмотреть профиль Отправить личное сообщение для Alex Lexcuk Посетить домашнюю страницу Alex Lexcuk Найти все сообщения от Alex Lexcuk
  № 5  
Ответить с цитированием
Alex Lexcuk

блогер
Регистрация: Mar 2008
Адрес: Донецк_city
Сообщений: 1,094
Записей в блоге: 5
Код:
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);
		}
	}
}
После немногочисленных экспериментов pivotPoint заработала, но как-то странно, точки начинают медленно приближаться и квадрат увеличивается в размерах спустя некотрое время.
если поствавить
Код:
mat3D.appendRotation(1, new Vector3D(0,0,2),myPivotPoint);//работает когда 3
myPivotPoint становится до фонаря, улетает в непонятном направлении.

Старый 18.02.2009, 14:46
RandomUser вне форума Посмотреть профиль Отправить личное сообщение для RandomUser Найти все сообщения от RandomUser
  № 6  
Ответить с цитированием
RandomUser

Регистрация: Mar 2006
Адрес: Odessa
Сообщений: 157
Насклько я понял, этот второй параметр - ось, вокруг которой мы будем вращать. И этот вектор должен быть нормализированным.
__________________
Не всех война убила - многих покалечила

Старый 19.02.2009, 00:59
Alex Lexcuk вне форума Посмотреть профиль Отправить личное сообщение для Alex Lexcuk Посетить домашнюю страницу Alex Lexcuk Найти все сообщения от Alex Lexcuk
  № 7  
Ответить с цитированием
Alex Lexcuk

блогер
Регистрация: Mar 2008
Адрес: Донецк_city
Сообщений: 1,094
Записей в блоге: 5
>>Насклько я понял, этот второй параметр - ось, вокруг которой мы будем вращать. И этот вектор должен быть нормализированным.

Спасибо, что разъяснили, попробую как-то нормализовать.

Старый 19.02.2009, 02:01
TERRORist вне форума Посмотреть профиль Отправить личное сообщение для TERRORist Найти все сообщения от TERRORist
  № 8  
Ответить с цитированием
TERRORist
 
Аватар для TERRORist

блогер
Регистрация: Jun 2005
Адрес: RU
Сообщений: 1,540
Записей в блоге: 12
normalize() 8]

или (0,0,1) вместо (0,0,2)

Старый 19.02.2009, 10:55
Alex Lexcuk вне форума Посмотреть профиль Отправить личное сообщение для Alex Lexcuk Посетить домашнюю страницу Alex Lexcuk Найти все сообщения от Alex Lexcuk
  № 9  
Ответить с цитированием
Alex Lexcuk

блогер
Регистрация: Mar 2008
Адрес: Донецк_city
Сообщений: 1,094
Записей в блоге: 5
>>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 из вращаемой точки, покрутить относительно нуля координат, а затем прибавить опять myPivotPoint.
И точки квадратика вращаются относительно myPivotPoint как было задумано.

PS. может как-то я неправильно понимаю понятие вектор и от этого получаются неправильные результаты вращения, т.к. точки которые я таким образом вращаю, возможно не есть вектора.

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

Регистрация: Mar 2006
Адрес: Odessa
Сообщений: 157
Пример из хелпа:
"Одним из способов вращения экранного объекта вокруг определенной точки относительно его расположения является настройка перемещения объекта в заданную точку, вращение объекта с использованием метода appendRotation() и обратное перемещение объекта а исходное положение. В следующем примере трехмерный экранный объект myObject осуществляет вращение по оси y вокруг точки с координатами (10,10,0)."
Код AS3:
myObject.z = 1; 
myObject.transform.matrix3D.appendTranslation(10,10,0);
myObject.transform.matrix3D.appendRotation(1, Vector3D.YAXIS);
myObject.transform.matrix3D.appendTranslation(-10,-10,0);
__________________
Не всех война убила - многих покалечила

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

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

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


 


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


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