Ориентация граней куба Papervision3D

У меня вопрос о Papervision3D или, возможно, bitmapData, я не уверен, в чем проблема. Я создал программу, которая берет 4 баннера и разбивает их на части, а затем применяет эти части к кубам, чтобы я мог сделать ротатор баннеров. Итак, после запуска программы у меня есть 10 кубиков с частью баннера на 4-х сторонах (спереди, сверху, сзади, снизу) каждого куба. Проблема в том, что некоторые грани неправильно сориентированы (повернут на 180 градусов). Есть ли способ в Papervision3D вращать грань куба? Другое место, где, как мне кажется, может быть проблема, - это когда я создаю bitmapData, который будет применяться к граням куба. Есть ли способ явно определить ориентацию во время создания bitmapData? Любая помощь или идеи будут приняты с благодарностью. Спасибо!

-------Редактировать----------

Вот код моего класса CubeMaker.as. Это класс, который берет части изображения и применяет их к кубам.

package  {

import away3d.events.MaterialEvent;
import away3d.materials.BitmapMaterial;
import away3d.materials.ColorMaterial;
import away3d.materials.TransformBitmapMaterial;
import away3d.primitives.Cube;
import away3d.primitives.data.CubeMaterialsData;
import CubeEvent;
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.Sprite;
import flash.events.Event;

public class CubeMaker extends Sprite {

    private var _colorMaterial:ColorMaterial = new ColorMaterial(0x000000);
    private var _dcRef;
    private var _banners:Array;
    private var _cubeArray:Array = [];
    private var _cubeCoung:int = 0;
    private var _numberOfPieces:int;
    private var _width:Number;
    private var _depth:Number;
    private var _height:Number;

    public function CubeMaker(banners:Array, numberOfPieces:int) {

        _dcRef = DocumentClass._base;
        _banners = banners;
        _numberOfPieces = numberOfPieces;
    }

    public function makeCubes() {

        //loop through the cubes
        for (var i = 0; i < _numberOfPieces; i++) {
            var faceBitmapArray:Array;

            //fill array with four faces for current cube
            faceBitmapArray =  fillFace(i);

            //get width and height from a piece instance
            var width:Number;
            var height:Number;
            var tempArray:Array;
            tempArray = _banners[0];
            _width = tempArray[0].width;
            _height = tempArray[0].height;
            _depth = tempArray[0].height;

            //create four materials from bitmapData
            var myFront:TransformBitmapMaterial = new TransformBitmapMaterial(faceBitmapArray[0], {rotation:0} );
            var myTop:TransformBitmapMaterial = new TransformBitmapMaterial(faceBitmapArray[1], {rotation:0.5} );
            var myBack:TransformBitmapMaterial = new TransformBitmapMaterial(faceBitmapArray[2], {rotation:0} );
            var myBottom:TransformBitmapMaterial = new TransformBitmapMaterial(faceBitmapArray[3], {rotation:0} );

            //create two materians from color
            var myLeft:ColorMaterial = new ColorMaterial(0x000000);
            var myRight:ColorMaterial = new ColorMaterial(0x000000);

            //create a CubeMatrialsData from the materials created above
            var myMaterials:CubeMaterialsData = new CubeMaterialsData( { front:myFront, back:myBack, top:myTop, bottom:myBottom, left:myLeft, right:myRight} );

            //listen for material change
            myMaterials.addOnMaterialChange(materialChanged);

            //create a new cube with the CubeMaterialsData created earlier
            var _cube = new Cube({width:_width, height:_height, depth:_depth, cubeMaterials:myMaterials}); 

            //the created cube is put into the _cubeArray
            _cubeArray[i] = _cube;
            if (i == (_numberOfPieces - 1)) cubesMade();
        }
    }
    private function fillFace(i:int):Array {
        var faceBitmapArray:Array = [];
        for (var j = 0; j < 4; j++) {
            //tempBannerArray filled with one banner in pieces
            var tempBannerArray:Array = _banners[j];
            //batmapData created and sized to current banner piece
            var bitmapData:BitmapData = new BitmapData(tempBannerArray[i].width, tempBannerArray[i].height);
            //bitmapData filled with current banner piece bitmap data
            bitmapData = tempBannerArray[i].bitmapData;
            bitmapData.lock();

            //array is filled with bitmap data
            faceBitmapArray[j] = bitmapData;
        }
        return faceBitmapArray;
    }

    private function cubesMade() {
        //dispatch event to notify of cube making completion
        dispatchEvent(new CubeEvent(CubeEvent.CUBES_MADE, _cubeArray.length));
    }

    private function materialChanged(e:MaterialEvent):void {
        trace("Warning! Warning! Material changed!");
    }

    public function get cubes():Array {
        return _cubeArray;
    }

    public function get cubeWidth():Number {
        return _width;
    }

    public function get cubeHeight():Number {
        return _height;
    }

    public function get cubeDepth():Number {
        return _depth;
    }
}   

}


person loveforvdubs    schedule 28.11.2011    source источник


Ответы (1)


Предисловие: Papervision3D почти не поддерживается / закрывается как библиотека , поэтому я настоятельно рекомендую использовать Away3D или другую 3D-библиотеку ActionScript. Хотя работа, проделанная над PV3D, была новаторской и невероятной с точки зрения флэш-памяти, поэтому, если вы хотите создать с ее помощью трехмерный опыт, это неплохо. Просто знайте с самого начала, что будущая поддержка dev + маловероятна.

Помимо предисловия, взгляните на примитивный класс "Cube" в библиотеке. Вы можете создать Материалы и прикрепить их к экземпляру MaterialsList, который будет добавлен к экземпляру куба. Предполагая, что вы используете BitmapMaterial, у него есть свойство «вращения», которое вы можете установить. Просто определите, какие материалы перевернуты, и сделайте их поворот на 180. Плюсы: быстро; Минусы: жестко запрограммированы.

Другой вариант - найти проблему в конце «актива» и перевернуть ваши изображения. Плюсы: быстро; Минусы: немасштабируемый или ставит проблему на дизайнера.

Лучший вариант при загрузке данных / ресурсов - иметь свойство «повернуть», которое вы можете использовать, чтобы указать, какие изображения следует переворачивать. Это куб, поэтому, как говорит Эндер, вверх относительно.

person Dominic Tancredi    schedule 28.11.2011
comment
Спасибо за отличное понимание! Я думаю, что первая проблема, которую нужно решить, - это переключение 3D-библиотек. Похоже, это может быть проблема с Papervision. Это странная проблема, потому что на любой стороне баннера переворачиваются только некоторые части, а не весь баннер. Так что перевернуть обложку будет недостаточно. Я посмотрю на использование Away3D, и, возможно, это поможет. - person loveforvdubs; 28.11.2011
comment
Удачи. Если вы разместите свою логику на разделении баннеров, возможно, это как-то связано с этим. - person Dominic Tancredi; 29.11.2011
comment
Спасибо. Я почти уверен, что с фактическим разделением баннера все в порядке. Причина в том, что когда я писал эту логику, я написал класс для отображения частей на сцене в 2D, и это сработало отлично. Только когда они начинают включать классы Papervision3D, они начинают сдаваться. - person loveforvdubs; 29.11.2011
comment
ну, я переключил свое приложение на Away3D, и рендеринг стал намного быстрее, и это приятно. Однако отображение материала еще хуже, теперь некоторые части повернуты на 90 в одну сторону, другие на 90 в другую, а некоторые повернуты на 180. Я думаю, мне может понадобиться логика, чтобы определить, в каком направлении находится изображение, возможно, ряд белых пикселей. что я обрезал прямо перед рендером, или что-то в этом роде. - person loveforvdubs; 29.11.2011
comment
Glad Away3D работает, нужно немного привыкнуть. Разместите свой код; может быть, мы сможем это выяснить. - person Dominic Tancredi; 30.11.2011
comment
Спасибо за помощь. Я разместил свой код в своем исходном вопросе выше, он был слишком большим, чтобы поместиться в комментариях. - person loveforvdubs; 30.11.2011