Rajawali 3d: вращение вокруг точки вращения

Я использую StreamingTexture для показа видео на экране с альфа-каналом. Верхняя половина видео имеет фактический контент, а нижняя половина содержит альфа-канал.

plane = new Plane(1, 2, 1, 1);//Plane height is 2 times the plane width due to the video size.
try {
        mMediaPlayer = new MediaPlayer();
        mMediaPlayer.setLooping(true);
        Uri videoUrl = Uri.parse("android.resource://" + getContext().getPackageName() + "/"
                + R.raw.angel);
        mMediaPlayer.setDataSource(getContext(), Uri.parse(videoUrl.toString()));
        mMediaPlayer.prepareAsync();    //prepare the player (asynchronous)
        mMediaPlayer.setOnPreparedListener(mp -> {
            mp.start(); //start the player only when it is prepared
        });
    } catch (IOException e) {
        e.printStackTrace();
    }


    // create texture from media player video
    mVideoTexture = new StreamingTexture("video", mMediaPlayer);

    // set material with video texture
    Material material =
            new Material(new VertexShader(R.raw.custom_vertix_shader),
                    new FragmentShader(R.raw.custom_fragment_shader));
    material.setColorInfluence(0f);

    try {
        material.addTexture(mVideoTexture);
    } catch (ATexture.TextureException e) {
        e.printStackTrace();
    }
    plane.setMaterial(material);
    getCurrentScene().addChild(plane);

Теперь, когда я поворачиваю эту плоскость, используя

plane.setRotation(Vector3.Axis.Z, angle); 

Размер плоскости прямоугольника (1, 2) вращается от центра (0,5, 1), как и предполагалось, но поскольку видео отображается только в верхней половине, это выглядит странно. Похоже, видео вращается с нижней половины.

Варианты решения:

  1. Поверните его от (0,5, 0,5) вместо (0,5, 1), но нет способа сделать это.

  2. Установите размер плоскости на 1,1 и обрежьте нижнюю половину видео, для этого также нет способа.

Пожалуйста, предложите, какие другие варианты я могу использовать или есть ли решение, использующее вышеуказанные параметры.


person Naveen    schedule 19.06.2017    source источник


Ответы (1)


Я реализовал это, используя вторую плоскость, которая точно такая же, как и первая, но не вращается. Затем я использовал координаты второй плоскости для расчета правильных значений положения после ее вращения.

private void setPlanePosition() {

    double radius = (0.5 * plane2.getScaleY());
    double circleCenterX = plane2.getX();
    double circleCenterY = plane2.getY() - radius;

    double xNewValue = (plane2.getX()) - radius * Math.sin(Math.toRadians(angle));
    double yNewValue = plane2.getY() - radius * Math.cos(Math.toRadians(angle)) + radius;
    plane.setPosition(xNewValue, yNewValue, -10);
}
person Naveen    schedule 22.06.2017