Ориентация граней куба Papervision3D - PullRequest
0 голосов
/ 28 ноября 2011

У меня есть вопрос о 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;
    }
}   

}

1 Ответ

1 голос
/ 28 ноября 2011

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

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

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

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

...