Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   позиционирование в 3D (http://www.flasher.ru/forum/showthread.php?t=117107)

DRAGOnoid 24.04.2009 14:08

Досадно. Что ж - буду знать.

про клиппинг ещё никогда не слышал а в Wiki написано про искажение звука =)

etc 24.04.2009 14:56

http://ru.wikipedia.org/wiki/%D0%9E%...BD%D0%B8%D0%B5

silin 24.04.2009 15:11

ага, почему-то getRelativeMatrix3D(root).position не всегда дает адекватные величины, понять почему не сумел пока..
попробовал немного погрузится в тему (ну очень немного)
в моих тестах нормально работает такой вариант:
по цепочке родителей через containerMatrix3D.deltaTransformVector(vector) и vector.add(containerVector) гоним вектор объекта до верхнего предка и берем Vector3D.distance от него до viewPoint
насколько оно грамотно/оптимально не знаю, но работает :), пример

DRAGOnoid 24.04.2009 15:28

клёва silin! чуть позже буду дома и гляну обязательно, + попробую написать простенький пример чего хочется добиться, наглядный пример лучший пример!

кстати мне до недавнего времени нравился мой метод сортировки, у которого взят за основу твой (правда старый):

Код AS3:

var array:Array = new Array();
var numChildren:int = this.numChildren;
for (var childIndex:int = 0; childIndex < numChildren; childIndex++) {
        var sprite:DisplayObject = this.getChildAt(childIndex);
        try {
                var vector3D:Vector3D = sprite.transform.getRelativeMatrix3D(root).position;
                vector3D.x -= stage.stageWidth / 2;
                vector3D.y -= stage.stageHeight / 2;
                vector3D.z += Math.round(root.transform.perspectiveProjection.focalLength * 1);
                array.push({length:vector3D.length, sprite:sprite});
        } catch (error:Error) {
                array.push({length:0, sprite:sprite});
        }
}               
array.sortOn('length', Array.DESCENDING);
for (var i:Object in array)
        this.addChild(array[i].sprite);

получаю таким образом расстояние, вбиваю в массив, сортирую и добавляю на сцену. сортировать по Z координате вообще тупо так как у кубика бывает 4 граени равноудалены от плоскости - root но двигая кубик по x координате грани так и не сортируются.

Если бы была возможность получить правильный вектор от точки обзора до объекта и правильный вектор нормали, то можно было бы найти правильный угол между этими векторами и определить лицевую и заднюю сторону спрайта. если на задний вид поставить visible=false а на передний visible=true не пришлось бы трогать addChild вообще, и кубик бы рисовался чётко и быстро )

DRAGOnoid 28.04.2009 12:17

СПАСИБО ЕЩЁ РАЗ ВСЕМ ОГРОМНОЕ. послушав многие советы и конкретно пошаманив, наконец добился того что так долго хотел.

наконец дошло как парвильно можно получить вектор нормали (надо было root а я трогал stage)

Код AS3:

//        вектор stage
public        function get vectorStage ():Vector3D {
        var vectorStage:Vector3D = new Vector3D();
 
        try {       
                vectorStage = this.transform.getRelativeMatrix3D(root).position;
                vectorStage.x -= stage.stageWidth / 2;
                vectorStage.y -= stage.stageHeight / 2;
                vectorStage.z += root.transform.perspectiveProjection.focalLength;
        } catch (error:Error){trace ('vector Stage - неможет быть найден');}
 
        return vectorStage;
}

а так же нормаль к плоскости

Код AS3:

//        вектор нормаль
public        function get vectorNormal ():Vector3D {
        var vectorNormal:Vector3D = new Vector3D();
 
        try {
                var matrix3D:Matrix3D = this.transform.getRelativeMatrix3D(root);
                vectorNormal.x = matrix3D.rawData[8]
                vectorNormal.y = matrix3D.rawData[9]
                vectorNormal.z = matrix3D.rawData[10]
        } catch (error:Error){trace ('vector Normal - неможет быть найден');}
 
        return vectorNormal;
}

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

public        function resort ():void {
var angle:Number = Vector3D.angleBetween(this.vectorStage, this.vectorNormal);
if (angle >= Math.PI/2)
        this.visible = false;
else
        this.visible = true;
}

вроде всё работает и без глюков! круто!


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

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