Papervision3D; вращать дочерние объекты в поле зрения камеры

Я впервые работаю с Papervision3D, и я создал слайд-шоу изображений с перекосом по оси Y. Слева самые маленькие фотографии, и они увеличиваются в размере вправо. Таким образом, они увеличивают масштаб слева направо, от наименьшего к наибольшему.

У меня есть всплывающая подсказка, которая появляется, когда вы наводите курсор на фотографию, но всплывающая подсказка также искажается пропорционально обзору камеры (наклонно). Я хочу, чтобы угол всплывающей подсказки не зависел от всего обзора камеры.

Есть идеи, как вращать объекты независимо от угла камеры родителя?

Спасибо!


person Community    schedule 04.09.2009    source источник


Ответы (2)


my_obj = новый DisplayObject3D (); my_plane = my_obj.addChild (новый самолет (бла-бла)); my_obj.lookAt (камера);

Бит "lookAt" - это то, что вам нужно.

person user19670    schedule 04.09.2009
comment
lookAt по какой-то досадной причине заставляет объект смотреть подальше от камеры (используйте текстовый объект с двусторонним материалом, чтобы понять, что я имею в виду). Кроме того, текст будет нарисован на плоскости, которая направлена ​​под углом к ​​камере, а не на плоскости, параллельной камерам рядом с плоскостью (что, вероятно, именно то, что он хочет). - person James Fassett; 05.09.2009

Почему бы не рисовать всплывающие подсказки в 2d? Вы можете получить положение изображений на экране, а затем просто нарисовать обычный спрайт следующим образом:

package 
{
import flash.display.Sprite;
import flash.text.TextField;

import org.papervision3d.events.InteractiveScene3DEvent;
import org.papervision3d.materials.ColorMaterial;
import org.papervision3d.objects.DisplayObject3D;
import org.papervision3d.objects.primitives.Plane;
import org.papervision3d.typography.Text3D;
import org.papervision3d.view.BasicView;

public class PVTest extends Sprite
{
    private var world:BasicView;
    private var text:Text3D;
    private var text2d:TextField;

    public function PVTest()
    {
        world = new BasicView(stage.width, stage.height, true, true);

        var colorMat:ColorMaterial = new ColorMaterial();
        colorMat.interactive = true;

        var planeContainer:DisplayObject3D = new DisplayObject3D();
        var plane:Plane;
        for(var i:int = 0; i < 11; i++)
        {
            plane= new Plane(
                colorMat,
                100, 100,
                10);
            plane.x = (i * 105) - 500;
            plane.addEventListener(InteractiveScene3DEvent.OBJECT_OVER, handleMouseOver);
            plane.addEventListener(InteractiveScene3DEvent.OBJECT_OUT, handleMouseOut);
            planeContainer.addChild(plane);
        }

        planeContainer.rotationY = 10;
        world.scene.addChild(planeContainer);

        world.camera.z = -500;

        addChild(world);
        world.startRendering();
    }

    private function handleMouseOver(event:InteractiveScene3DEvent):void
    {
        var plane:Plane = Plane(event.displayObject3D);
        plane.calculateScreenCoords(world.camera);

        const OFFSET_X:int = -20;
        const OFFSET_Y:int = 30;
        text2d = new TextField();
        text2d.text = "toolTip";
        text2d.x = plane.screen.x + (stage.width/2) + OFFSET_X;
        text2d.y = plane.screen.y + (stage.height/2) + OFFSET_Y;
        addChild(text2d);
    }

    private function handleMouseOut(event:InteractiveScene3DEvent):void
    {
        removeChild(text2d);
    }
}

}

Даже для этого примера вам придется сместить y положение всплывающей подсказки в зависимости от масштаба объекта, но это может быть проще, чем определение поворота, и это лучший способ получить единообразный результат.

person James Fassett    schedule 05.09.2009