Android ViewGroup Вращение в 3d

1

Я хочу повернуть свой собственный FrameLayout в 3d в android. Должен ли я использовать класс GlSurfaceView. Я новичок в компьютерной графике, но знаю теорию вращения и переводов. Для того, чтобы сделать 3d opengl вращения, мы делаем следующее.

В классе активности мы создаем объект GLSurfaceView и устанавливаем его средство визуализации. Объект Renderer создается из класса, который реализует интерфейс GlSurfaceView.Renderer.

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    GLSurfaceView view = new GLSurfaceView(this);
    view.setRenderer(new OpenGLRenderer());
    setContentView(view);
}

В нашем классе Renderer мы делаем рисунки, вращения и переводы следующими способами.

// Called when the surface is created or recreated.
public void onSurfaceCreated(GL10 gl, EGLConfig config) 

// Called to draw the current frame.
public void onDrawFrame(GL10 gl)

// Called when the surface changed size.
public void onSurfaceChanged(GL10 gl, int width, int height)

Однако у меня есть пользовательская функция frameelayout, которая объявляется как

public class RotatedMapView extends FrameLayout

Я хочу сделать это:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    RotatedMapView  view = new RotatedMapView (this);
    view.setRenderer(new OpenGLRenderer());
    setContentView(view);
}

Но я не могу, потому что setRenderer специально для GlSurfaceView. Теперь я просматриваю исходный код GlSurfaceView.java, чтобы адаптировать его к моему дизайну. Ссылка, найденная для GlSurfaceVİew.java, http://code.google.com/p/apps-for-android/source/browse/trunk/SpriteMethodTest/src/com/android/spritemethodtest/GLSurfaceView.java?r=150 Источник слишком длинный. На самом деле я не ленив читать, но я хочу быть уверенным, правильно ли я.

Теги:
3d
rotation

2 ответа

0
Лучший ответ

Framelayouts (и любой расширяемый вид) предназначены для рисования на элементе Canvas в 2D. Это невозможно использовать с помощью openGL. Если вы хотите нарисовать графический интерфейс в 3D/GL, вам придется скомпоновать код с нуля или найти библиотеку, которая уже сделала это. Я уверен, что есть несколько, но у меня еще не было необходимости.

Вы можете получить некоторые поддельные 3D-эффекты для просмотров, используя масштабные анимации, хотя они будут работать только в том случае, если анимация выполняется быстро, поэтому пользователь не замечает. Возможно, это не то, что вам нужно.

<set xmlns:android="http://schemas.android.com/apk/res/android">
<scale
    android:fromXScale="1.0" android:toXScale="0.0"
    android:fromYScale="1.0" android:toYScale="1.0"
    android:pivotX="50%" android:pivotY="0%"
    android:duration="@android:integer/config_shortAnimTime"
/>

  • 0
    На самом деле мне нужно повернуть mapview в 3d. Есть ли способ сделать это?
  • 0
    Вы можете попробовать использовать вышеуказанную анимацию. Это даст полу 3D вращение вокруг оси Y. Если ты хочешь что-то лучше, чем тебе не повезло
Показать ещё 3 комментария
2

Теперь я смотрю анимации, которые я никогда не использовал. В api demos есть пример вращения по оси y. Я хочу сделать поворот над x. Он подходит для отрицательных углов, но в положительном направлении он исчезает. Функция ниже.

@Override
protected void applyTransformation(float interpolatedTime, Transformation t) {
    final float fromDegrees = mFromDegrees;
    float degrees = fromDegrees + ((mToDegrees - fromDegrees) * interpolatedTime);

    final float centerX = mCenterX;
    final float centerY = mCenterY;
    final Camera camera = mCamera;

    final Matrix matrix = t.getMatrix();

    camera.save();
    if (mReverse) {
        camera.translate(0.0f, 0.0f, mDepthZ * interpolatedTime);
    } else {
        camera.translate(0.0f, 0.0f, mDepthZ * (1.0f - interpolatedTime));
    }
    camera.rotateY(degrees);
    `camera.rotateX(degrees);  //i want to do this it works for negative but not` //positive angles 

camera.getMatrix(matrix);
camera.restore();

matrix.preTranslate(-centerX, -centerY);
matrix.postTranslate(centerX, centerY);

}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню