Papervision3D: камера смотрит на самолет - PullRequest
1 голос
/ 06 января 2010

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

    private function planeClicked(e:InteractiveScene3DEvent):void 
    {
        lookAtTarget.copyTransform(this);

        var time:Number = 1;
        var tweenObject:Object = {};
        tweenObject.x = lookAtTarget.x;
        tweenObject.y = lookAtTarget.y;
        tweenObject.z = lookAtTarget.z;
        tweenObject.rotationX = lookAtTarget.rotationX;
        tweenObject.rotationY = lookAtTarget.rotationY;
        tweenObject.rotationZ = lookAtTarget.rotationZ;
        tweenObject.onUpdate = onSeatTween;
        tweenObject.ease = Cubic.easeInOut;
        TweenMax.to(lookAtMe, time, tweenObject);
    }

    private function onSeatTween():void
    {
        camera.lookAt(lookAtMe);
    }

Камера центрируется на плоскости looAtMe, но не вращается, так что выбранная плоскость находится прямо.

Пожалуйста, помогите! Спасибо.

Ответы [ 3 ]

2 голосов
/ 06 января 2010

Знаете ли вы, что ваш самолет нормальный? Это правда, он определяет, с какой стороны самолет стоит. Нормаль - это вектор длиной 1.

Вы можете вычислить нормаль плоскости, если знаете три трехмерные точки на ней. Например: центр, центр сверху и центр справа. Давайте назовем центр C, центр сверху M1 и центр справа M2.

Вот как рассчитать нормаль:

Cross(C - M1, C - M2)

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

Это даст вам вектор, определенный стрелкой:

alt text

Хорошо, так как мы можем использовать эту информацию? Зная нормали плоскости и ее центра, можно сказать следующее:

camera_position = plane_position + (plane_normal * distance)

Это позволит установить камеру в правильном положении, на некотором расстоянии от плоскости.

camera_direction = plane_normal * -1

Это заставляет камеру смотреть на самолет.

Однако я не думаю, что ActionScript 3 определяет взгляд камеры на функцию с вектором, я думаю, что он использует объект. Вы можете, например, поместить небольшой невидимый объект в центр плоскости и направить камеру на это. Это должно дать вам желаемый результат.

1 голос
/ 12 января 2010

В блоге PV3D.org есть рабочий пример , который должен быть именно тем, что вы ищете.

1 голос
/ 06 января 2010

Я думаю, что вы хотите работать в обратном направлении - сначала выберите точку на плоскости (X, Y, Z) (путем усреднения?), На которую вы хотите посмотреть. Затем выберите расстояние D от той точки, которой вы хотите быть.

Далее возьмем уравнение плоскости http://mathworld.wolfram.com/Plane.html ax + by + cz = d (разные d) и оттуда выведем нормальный вектор n = (a, b, c). Нормализовать его и умножить на D, чтобы получить N = (A, B, C). Теперь есть только две точки, из которых вы могли бы смотреть: (X, Y, Z) +/- (A, B, C).

Итак, теперь выберите, хотите ли вы смотреть сзади или спереди - это повлияет на выбор + против - я просто не знаю, что есть что.

...