2013-10-01 3 views
5

Я довольно новичок в разработке Android, я знаю основные действия, карты, sqlite и т. Д. Я хотел бы иметь возможность реализовать некоторые 3D-объекты возможность взаимодействия с моими приложениями. После небольшого поиска я обнаружил, что rajawali кажется лучшим методом. Как и вы, я начал с первого учебника и прочитал исходный код из примера docs. Где я потерялся, я последовал за учебным словом, и я не могу запустить приложение из-за ошибок в скрипте. Если кто-то использовал Раджавали, прежде чем я подниму некоторые указания относительно того, где я поступил неправильно. (учебник был обновлен 2 месяца назад, поэтому его довольно недавно). TutorialКак вы получаете rajawali для работы (учебник 1 по git)

Вот мой исходный код

MainActivity:

package rajawali.tutorials; 

import rajawali.RajawaliActivity; 
import android.os.Bundle; 
import android.view.Menu; 

public class MainActivity extends RajawaliActivity { 
    private Renderer mRenderer; 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     mRenderer = new Renderer(this); 
     mRenderer.setSurfaceView(mSurfaceView); 
     super.setRenderer(mRenderer); 
    } 
} 

Renderer:

package rajawali.tutorials; 

import javax.microedition.khronos.opengles.GL10; 

import android.content.Context; 
import rajawali.lights.DirectionalLight; 
import rajawali.materials.textures.ATexture.TextureException; 
import rajawali.materials.textures.Texture; 
import rajawali.primitives.Sphere; 
import rajawali.renderer.RajawaliRenderer; 

public class Renderer extends RajawaliRenderer { 

    private DirectionalLight mLight; 
    Sphere mSphere; 

    public Renderer(Context context) { 
     super(context); 
     setFrameRate(60); 
    } 
    public void initScene() { 
     mLight = new DirectionalLight(1f, 0.2f, -1.0f); 
     mLight.setColor(1.0f, 1.0f, 1.0f); 
     mLight.setPower(2); 

     try { 
      *DiffuseMaterial* material = new *DiffuseMaterial*(); //there is an error here (DiffuseMaterial cannot be rsolved as a type) 
      material.addTexture(new *Texture(R.drawable.earthtruecolor_nasa_big)*); //here (constructor Texture(int) cannot be defined) 
      mSphere = new Sphere(1, 24, 24); 
      mSphere.setMaterial(material); 
      mSphere.*addLight(mLight)*; //and here (The method addLight(DirectionalLight) is undefined for the type Sphere) 
      addChild(mSphere); 
     } catch (TextureException e) { 
      e.printStackTrace(); 
     } 
     getCurrentCamera().setZ(4.2f); 
    } 

    @Override 
    public void onDrawFrame(GL10 glUnused) { 
     super.onDrawFrame(glUnused); 
     mSphere.setRotY(mSphere.getRotY() + 1); 
    } 

} 

Я реально не хочу быть код подачи ложка, если я могу помочь ему, но его что ошибка находится в «DiffuseMaterial». Почему это или есть лучший способ манипулирования 3D-объектами, кроме использования min3D или Rajawali?

ответ

7

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

Класс RajawaliTutorialActivity

package rajawali.tutorials; 

import rajawali.RajawaliActivity; 
import android.os.Bundle; 

public class RajawaliTutorialActivity extends RajawaliActivity { 

    public RajawaliTutorialRenderer mRenderer; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     mRenderer = new RajawaliTutorialRenderer(this); 
     mRenderer.setSurfaceView(mSurfaceView); 
     super.setRenderer(mRenderer); 
    } 
} 



Класс RajawaliTutorialRenderer

package rajawali.tutorials; 

import javax.microedition.khronos.opengles.GL10; 

import android.content.Context; 

import rajawali.Camera; 
import rajawali.Object3D; 
import rajawali.lights.DirectionalLight; 
import rajawali.materials.Material; 
import rajawali.materials.textures.ATexture.TextureException; 
import rajawali.materials.textures.Texture; 
import rajawali.primitives.Sphere; 
import rajawali.renderer.RajawaliRenderer; 

public class RajawaliTutorialRenderer extends RajawaliRenderer { 

    public DirectionalLight light; 
    public Object3D sphere; 
    public Context context; 
    public Camera camera; 

    public RajawaliTutorialRenderer(Context context) { 
     super(context); 
     this.context = context; 
     setFrameRate(60); 
    } 

    public void initScene() { 
     light = new DirectionalLight(1f, 0.2f, -1.0f); // set the direction 
     light.setColor(1.0f, 1.0f, 1.0f); 
     light.setPower(2); 

     try{ 
      Material material = new Material(); 
      material.addTexture(new Texture("earthColors", R.drawable.earthtruecolor_nasa_big)); 
      material.setColorInfluence(0); 
      sphere = new Sphere(1, 24, 24); 
      sphere.setMaterial(material); 
      getCurrentScene().addLight(light); 
      super.addChild(sphere); 
     } catch (TextureException e){ 
      e.printStackTrace(); 
     } 

     getCurrentCamera().setZ(4.2f); 
    } 

    @Override 
    public void onDrawFrame(GL10 glUnused) { 
     super.onDrawFrame(glUnused); 
     sphere.setRotY(sphere.getRotY() + 1); 
    } 
} 

Смотрите, что изменения являются:

  1. объявить sphere объект как Object3D вместо Sphere.
  2. изменение DiffuseMaterialMaterial для описания материалов.
  3. изменить параметры, чтобы получить Texture. Первый параметр - это пользовательский идентификатор, а второй параметр - идентификатор ресурса.
  4. добавить строку material.setColorInfluence(0); после текстуры нагрузки, если эта строка не добавлена, «сердце» становится красным (я не уверен, почему).
  5. заменить sphere объект по объекту объекта (доступ с помощью метода getCurrentScene) для вызова addLight метод.
  6. Добавить Try/задвижка для линии material.addTexture() как этот метод в настоящее время бросает TextureException
  7. добавить getCurrentCamera().setZ(4.2f); к концу initScene
+0

Это потрясающе спасибо. Интересно, почему учебник не работает. Остальные учебники похожи на это? –

+0

Не уверен, я не пытался сделать еще один учебник, но, похоже, учебник был сделан для предыдущей версии rajawali. – doanvelagui

+2

super.addChild больше не работает. 'getCurrentScene(). addChild' действительно работает. – nunespascal

2

Похоже, что это связано с версией Rajawali.

На this page он говорит не использовать master ветвь:

Выбираете ли вы клонировать или скачать, вы, вероятно, хотите использовать один из тегов выпуска. Ведущая ветвь библиотеки и примеров используется для разработки и должна считаться нестабильной для производственного кода. Когда мы выпустим стабильную версию, она будет помечена. Если вы клонируете, вы можете просто проверить тег.

Если вы клонировали Rajawali с помощью git, вы хотите, чтобы проверка из тега. Чтобы вывести список тегов:

$ git tag 
v0.9 

На момент написания v0.9 ваш единственный выбор.

$ git checkout v0.9 

Теперь у вас будет DiffuseMaterial. Однако некоторые из других классов все еще отсутствуют.

EDIT:

Это выглядит как этот учебник ни относится к v0.9, ни последней основной ветви. Я сделал рабочую версию учебника 1, в которой you can find linked here.

1

Вы также можете использовать приложение RajawaliExamples, которое я написал, которое составлено из представленных примеров, в качестве демонстрации использования главной ветви.

https://github.com/MasDennis/RajawaliExamples

также уточнить на деканов цитаты, заявление, сделанное там отговорить людей от бесконтрольного когда API изменился под ними, которые в основном актуально, когда jwoolston прилагает большие изменения для поддержки графики сцены. Основная часть этой работы выполняется, и если когда-либо закончится, api, скорее всего, значительно изменится от своего текущего состояния, так как другие основные элементы уже завершены. Такие предметы - это фрагменты, такие как анимация, больше вариантов синтаксического анализа, гибкая рендеринг и т. Д.

 Смежные вопросы

  • Нет связанных вопросов^_^