|
|
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
|
|||||
Функция реалистичного вращения эллипса
Знаю что можно сделать подобное с окружностью с помощью функции такого рода:
function pxInDeg(circleWidth:Number):Number { return (2 * Math.PI * (circleWidth / 2) / 360); } Но как узнать то же самое у эллипса, и как осуществить его вращение? Оно ведь будет неравномерным при разных положениях эллипса.
__________________
Рожденный ползать, везде пролезет... |
|
|||||
Modus ponens
|
Эллипс ничем не примечателен в этом отношении - вам всего нужно придумать где будет точка вращения и до вращения отнять смещение по X и Y а после вращения X и Y добавить:
var matrix:Matrix = new Matrix(); // вместо этого скопировать матрицу у вашей фигуры var point:Point = new Point(); // вместо этого задать точку, вокруг которой нужно вращать var angle:Number = Math.PI; // задать какой-нибудь угол matrix.tx -= point.x; matrix.ty -= point.y; matrix.rotate(angle); matrix.tx += point.x; matrix.ty += point.y; // присвоить трансформированую матрицу вашей фигуре
__________________
Hell is the possibility of sanity |
|
|||||
Что такое матрица в данном случае?
Каким образом задать точку вращения? Что за объекты tx и ty? Каким образом присваиваеться трансформированная матрица фигуре? И почему сначала отнимается смещение, а потом добавляется? Можешь привести пожалуйста пример, и расписать что зачем нужно...
__________________
Рожденный ползать, везде пролезет... |
|
|||||
Modus ponens
|
Matrix - вбить название класса в редакторе, выделить и нажать F1, аналогично Point. tx и ty - смещение матрицы по оси абсцисс и ординат соответственно.
var r:int = 80; var angle:Number = 0; var registrationPoint:Point = new Point(r, r); var rotationStep:Number = Math.PI / 180; var poligon:Shape = drawPoly(7, r, 0); function drawPoly(corners:int, radius:int, color:uint):Shape { var step:Number = Math.PI / (corners * 0.5); var len:Number = Math.PI * 2; var i:Number = step; var s:Shape = new Shape(); var g:Graphics = s.graphics; g.beginFill(color, 0.2); g.lineStyle(1, color, 1, true, LineScaleMode.NONE); g.moveTo(radius + radius * Math.cos(i), radius + radius * Math.sin(i)); while (i <= len) { g.lineTo(radius + radius * Math.cos(i), radius + radius * Math.sin(i)); i += step; } g.endFill(); g.beginFill(0); g.drawCircle(radius, radius, 2); s.cacheAsBitmap = true; return this.addChild(s) as Shape; } this.addEventListener(Event.ENTER_FRAME, enterFrameHandler); function enterFrameHandler(event:Event):void { var matrix:Matrix = new Matrix(); angle += rotationStep; angle = angle % (Math.PI * 2); matrix.tx -= registrationPoint.x; matrix.ty -= registrationPoint.y; matrix.rotate(angle); matrix.tx += registrationPoint.x; matrix.ty += registrationPoint.y; poligon.transform.matrix = matrix; }
__________________
Hell is the possibility of sanity |
|
|||||
Мы похоже друг друга не поняли.
Под эллипсом я подразумевал круг с высотой неравной ширине, т.е. по другому говоря -овал. Кстати, в твоем примере объект не движется по X. Добавлено через 9 минут var pxInDeg:Number = 2*Math.PI * (ball.width / 2) / 360; var speed:Number = 3; stage.addEventListener(Event.ENTER_FRAME, moving); function moving(e:Event):void { ball.x += pxInDeg * speed; ball.rotation += speed; } Тоже самое нужно сделать с овалом, вот только у овала постоянно будет меняться высота, и без правильных расчетов он будет 80% движений висеть в воздухе. Т.е. овал должен постоянно соприкасаться с землей, но при этом двигаться на то расстояние, насколько он повернулся.
__________________
Рожденный ползать, везде пролезет... |
|
|||||
Вот о чем я говорю (см. приложение).
__________________
Рожденный ползать, везде пролезет... |
|
|||||
Я просто код скопипастил и проверил.
__________________
Рожденный ползать, везде пролезет... |
Часовой пояс GMT +4, время: 11:16. |
|
« Предыдущая тема | Следующая тема » |
Теги |
вращение , как , реалистичное |
|
|