Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Вращение вокруг своей оси (http://www.flasher.ru/forum/showthread.php?t=207302)

tihomir 07.04.2014 16:07

Вращение вокруг своей оси
 
Здравствуйте!

Понадобилось сделать вращение предмета вокруг своей оси (по оси У),
вроде бы просто, но при повороте объект растягивается (по оси Х) а потом обратно, вроде бы не сильно но всё равно смотрится не эстетично)
Что это такое и как с этим бороться?)
Код:
Код AS3:

import flash.display.MovieClip;
import flash.events.Event;
 
var speed = 1;
var test:MovieClip = new Test();
test.x = 50;
test.y = 50;
 
addChild(test);
 
test.addEventListener(Event.ENTER_FRAME, loop);
 
function loop(e:Event):void
{
 test.rotationY += speed;//Поворачиваем объект
}


caseyryan 07.04.2014 17:10

Видимо это перспектива...

Akopalipsis 07.04.2014 17:16

Цитата:

Видимо это перспектива...
Впервые услышав о таком вращении, решил посмотреть о чем говорит ТС и мне сразу кинулось в глаза,
что перспектива хоть и есть, но она почему-то только на левую сторону действует, правая сторона осталась обделенной. Вот может именно о этом ТС и спрашивает?

samana 07.04.2014 17:31

Цитата:

Сообщение от Akopalipsis (Сообщение 1163130)
мне сразу кинулось в глаза, что перспектива хоть и есть, но она почему-то только на левую сторону действует, правая сторона осталась обделенной.

А как вы это увидели, ведь ТС не предоставил исходников, а лишь только код?

Akopalipsis 07.04.2014 17:37

Вложений: 1
Цитата:

А как вы это увидели, ведь ТС не предоставил исходников, а лишь только код?
Цитата:

Впервые услышав о таком вращении, решил посмотреть о чем говорит ТС
Вот скрин, почему толька одна сторона под перспективу попадает?

samana 07.04.2014 17:46

Странный результат, не сталкивался с таким.

Rivexe 07.04.2014 18:02

Вложений: 2
Дело состоит в проекции. Центр проекции(точка схода) задан в центре рабочей области, поэтому при разных позициях объекта на экране, проекция тоже будет разная. Пронаблюдать это можно, если подвигать объект во время вращения:
Код AS3:

import flash.display.MovieClip;
import flash.events.Event;
import flash.events.MouseEvent;
 
var speed = 1;
var test:MovieClip = new Test();
test.x = 50;
test.y = 50;
 
addChild(test);
 
test.addEventListener(Event.ENTER_FRAME, loop);
stage.addEventListener(MouseEvent.MOUSE_MOVE, mouseMoveHandler);
 
function loop(e:Event):void
{
        test.rotationY +=  speed;//Поворачиваем объект
}
 
function mouseMoveHandler(e:MouseEvent):void
{
        test.x = e.stageX;
        test.y = e.stageY;
}

test_1.swf   (1.1 Кб)


Однако точку схода можно менять:
Код AS1/AS2:

import flash.display.MovieClip;
import flash.events.Event;
import flash.events.MouseEvent;
 
var speed = 1;
var test:MovieClip = new Test();
test.x = 50;
test.y = 50;
 
addChild(test);
 
test.addEventListener(Event.ENTER_FRAME, loop);
stage.addEventListener(MouseEvent.MOUSE_MOVE, mouseMoveHandler);
 
function loop(e:Event):void
{
        test.rotationY +=  speed;//Поворачиваем объект
}
 
function mouseMoveHandler(e:MouseEvent):void
{
        test.x = e.stageX;
        test.y = e.stageY;
 
        test.parent.transform.perspectiveProjection.projectionCenter = new Point(test.x, test.y);
}

test_2.swf   (1.2 Кб)

Akopalipsis 07.04.2014 18:07

Rivexe Спасибо за объяснение! И у меня ещё вопрос -
Вы эти примеры делали в адоби и точка регистрации находится в центре?

Rivexe 07.04.2014 18:12

Точка регистрации у объекта? Да в центре объекта.

tihomir 07.04.2014 20:15

Спасибо всем за объяснения, очень помогли

Akopalipsis 07.04.2014 20:48

Цитата:

Точка регистрации у объекта? Да в центре объекта.
А что делать если объект не нарисован в адоби? Ведь если даже менять координаты,
чтобы казалось, что центр всегда в центре, то это не поможет, одна сторона ведь всегда не измена...?

samana 07.04.2014 20:54

Цитата:

Сообщение от Akopalipsis (Сообщение 1163155)
А что делать если объект не нарисован в адоби? Ведь если даже менять координаты,
чтобы казалось, что центр всегда в центре, то это не поможет, одна сторона ведь всегда не измена...?

Но ведь можно нарисовать программно и так, чтобы визуально центр графики находился в точке регистрации. Либо если это картинки, то сместить их. Или можно положить спрайт в другой спрайт, и отцентрировать его.
p.s. А может я не совсем правильно понял ваш вопрос...

Akopalipsis 07.04.2014 21:15

samana Спасибо! Вы правильно поняли.
Просто я почему-то плохо отношусь к отрисовать в ещё один или сместить центр при рисовании.
Но в данном случаи, наверное по другому уже не как не получится..

samana 07.04.2014 21:32

Цитата:

Сообщение от Akopalipsis (Сообщение 1163158)
Просто я почему-то плохо отношусь к отрисовать в ещё один или сместить центр при рисовании.

Я думаю вам не нужно заморачиваться по этому поводу :) и даже использовать всё что можно для достижение необходимого результата. Сместить графику в объекте, совершенно не запрещено и не является плохим тоном. Ну что же делать если нужно закрутить вентилятор? Конечно легче поставить центр графики в точку регистрации спрайта, чтобы завертелось, а не использовать дополнительные преобразования матрицы объекта)

caseyryan 07.04.2014 21:49

Цитата:

а не использовать дополнительные преобразования матрицы объекта)
Тем более, что за кадром то именно это и произойдет

tihomir 08.04.2014 09:03

Я так понял совсем избавиться от этого эффекта нельзя?

Rivexe 08.04.2014 11:40

tihomir, покажите скриншот как у вас получилось и по возможности картинку, как вы бы хотели что бы получилось.

tihomir 08.04.2014 15:39

Вложений: 2
1 скриншот как получилось 2 как должен по идее поворачиваться(такой результат получился в процессе создания анимации движения на таймлайне, просто делаем отразить по горизонтали и пока проигрывается анимация он поворачивается)


Ууууу блин, вторая картинка не та(( Но думаю суть ясна, что при повороте объект не растягивается вправо

Rivexe 08.04.2014 16:15

Вложений: 2
Скорее всего у вашего клипа стоит точка привязки не по центру или вы не поменяли projectionCenter.

Должно вращаться вот так:
test_3.swf   (58.3 Кб)


Если не хотите заморачиваться с projectionCenter, то вместо rotationY просто меняйте scaleX
test_4.swf   (58.2 Кб)

Код AS3:

import flash.display.MovieClip;
import flash.events.Event;
import flash.events.MouseEvent;
 
var test:MovieClip = new Test();
test.x = stage.stageWidth * .5;
test.y = stage.stageHeight * .5;
addChild(test);
 
test.addEventListener(Event.ENTER_FRAME, loop);
stage.addEventListener(MouseEvent.MOUSE_MOVE, mouseMoveHandler);
 
var t:Number = 0;
var s:Number = 0.05;
function loop(e:Event):void
{
        test.scaleX = Math.sin(t+=s);
}
 
function mouseMoveHandler(e:MouseEvent):void
{
        test.x = e.stageX;
        test.y = e.stageY;
}


Akopalipsis 08.04.2014 16:20

Положите картинку в Sprite и сместите её так, чтобы её середина была в точке регистрации спрайта и задайте свойству projectionCenter
координаты этого спрайта.

Rivexe 08.04.2014 16:26

Akopalipsis, попробуйте отрисовывать прямоугольник так:
Код AS3:

_target.graphics.drawRect(-100, -50, 200, 100);

а projectionCenter задавать так:
Код AS3:

perspective.projectionCenter = new Point(_target.x, _target.y);


Akopalipsis 08.04.2014 16:32

Rivexe да, Спасибо! я так и сделал и изменил предыдущий пост, где посоветовал ТС, поместить картинку в спрайти и сместить её относительно точки регистрации.


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

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