您的位置:首页 > 移动开发 > Android开发

osg for android (一) 简单几何物体的加载与显示

2014-10-27 21:21 381 查看
1. 首先需要一个OSG for android的环境

(1)NDK 现在Eclipse 对NDK已经相当友好了,已经不需要另外cygwin的参与,具体可以参考

Android NDK开发篇(一):新版NDK环境搭建(免Cygwin,超级快)

(2).OSG for android的编译,参考 osg for android学习之一:windows下编译(亲测通过) 建议编译OpenGL ES2版本.

2.然后加载OSG自带的Example:osgAndroidExampleGLES2

(1)点击菜单键加载文件路径,输入/sdcard/osg/cow.osg(必须先往sdcard创建文件夹osg并把cow.osg放到该文件夹里边)



(2)接着经典的牛出现了:)




3.自带的example太多的代码,这样的代码无论对于NDK的初学者或OSG很不直观,所以本人重写了一个HelloWolrd for

osg的例子。例子很简单,就是简单加载一个四边形并附上颜色。

(1)java代码

C++ Code
1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

package com.example.helloosg;

import javax.microedition.khronos.egl.EGLConfig;

import javax.microedition.khronos.opengles.GL10;

import android.opengl.GLSurfaceView.Renderer;

public class NDKRenderer implements Renderer{



NDKRenderer(){

}



@Override

public void onSurfaceCreated(GL10 gl, EGLConfig config) {

// TODO Auto-generated method stub

gl.glEnable(GL10.GL_DEPTH_TEST);

}

@Override

public void onSurfaceChanged(GL10 gl, int width, int height) {

// TODO Auto-generated method stub

osgNativeLib.init(width, height);

}

@Override

public void onDrawFrame(GL10 gl) {

// TODO Auto-generated method stub

osgNativeLib.step();

}

}
C++ Code
1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

package com.example.helloosg;

public class osgNativeLib {



static {

System.loadLibrary("osgNativeLib");

}

/**

* @param width the current view width

* @param height the current view height

*/

public static native void init(int width, int height);

public static native void step();

}

C++ Code
1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

package com.example.helloosg;

import android.app.Activity;

import android.opengl.GLSurfaceView;

import android.os.Bundle;

import android.view.Menu;

import android.view.MenuItem;

import android.widget.TextView;

public class MainActivity extends Activity {

private GLSurfaceView mGLSurfaceView;



@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

mGLSurfaceView = new GLSurfaceView(this);

mGLSurfaceView.setEGLContextClientVersion(2);

NDKRenderer renderer = new NDKRenderer();

this.mGLSurfaceView.setRenderer(renderer);

this.setContentView(mGLSurfaceView);

}

@Override

public boolean onCreateOptionsMenu(Menu menu) {

// Inflate the menu; this adds items to the action bar if it is present.

getMenuInflater().inflate(R.menu.main, menu);

return true;

}

@Override

protected void onResume() {

// TODO Auto-generated method stub

super.onResume();

mGLSurfaceView.onResume();

}

@Override

protected void onPause() {

// TODO Auto-generated method stub

super.onPause();

mGLSurfaceView.onPause();

}

@Override

public boolean onOptionsItemSelected(MenuItem item) {

// Handle action bar item clicks here. The action bar will

// automatically handle clicks on the Home/Up button, so long

// as you specify a parent activity in AndroidManifest.xml.

int id = item.getItemId();

if (id == R.id.action_settings) {

return true;

}

return super.onOptionsItemSelected(item);

}

}

(2)JNI代码

C++ Code
1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

/ * Created on: 2014-10-19

* Author: VCC

*/

#include "OsgMainApp.h"

OsgMainApp::OsgMainApp() {

}

void OsgMainApp::initOsgWindow(int x, int y, int width, int height) {

__android_log_write(ANDROID_LOG_ERROR, "OSGANDROID", "Init geometry");

_viewer = new osgViewer::Viewer();

_viewer->setUpViewerAsEmbeddedInWindow(x, y, width, height);

_viewer->setThreadingModel(osgViewer::ViewerBase::SingleThreaded);

_root = new osg::Group();

_viewer->realize();

_viewer->addEventHandler(new osgViewer::StatsHandler);

_viewer->addEventHandler(

new osgGA::StateSetManipulator(

_viewer->getCamera()->getOrCreateStateSet()));

_viewer->addEventHandler(new osgViewer::ThreadingHandler);

_viewer->addEventHandler(new osgViewer::LODScaleHandler);

_manipulator = new osgGA::KeySwitchMatrixManipulator;

_manipulator->addMatrixManipulator('1', "Trackball",

new osgGA::TrackballManipulator());

_viewer->setCameraManipulator(_manipulator.get());

_viewer->getViewerStats()->collectStats("scene", true);

loadModels();

}

void OsgMainApp::draw() {

_viewer->frame();

}

void OsgMainApp::loadModels() {

osg::ref_ptr<osg::Node> loadedModel = osgDB::readNodeFile(

"/sdcard/osg/cow.osg");

loadedModel->setName("cow");

if (loadedModel != NULL) {

__android_log_print(ANDROID_LOG_ERROR, "OSGANDROID", "Not NULL");

}

osg::Shader * vshader = new osg::Shader(osg::Shader::VERTEX, gVertexShader);

osg::Shader * fshader = new osg::Shader(osg::Shader::FRAGMENT,

gFragmentShader);

osg::Program * prog = new osg::Program;

prog->addShader(vshader);

prog->addShader(fshader);

osg::ref_ptr<osg::Node> node = createNode();

//loadedModel->getOrCreateStateSet()->setAttribute(prog);

node->getOrCreateStateSet()->setAttribute(prog);

//_root->addChild(loadedModel);

_root->addChild(node);

osgViewer::Viewer::Windows windows;

_viewer->getWindows(windows);

for (osgViewer::Viewer::Windows::iterator itr = windows.begin();

itr != windows.end(); ++itr) {

(*itr)->getState()->setUseModelViewAndProjectionUniforms(true);

(*itr)->getState()->setUseVertexAttributeAliasing(true);

}

_viewer->setSceneData(NULL);

_viewer->setSceneData(_root.get());

_manipulator->getNode();

_viewer->home();

_viewer->getDatabasePager()->clear();

_viewer->getDatabasePager()->registerPagedLODs(_root.get());

_viewer->getDatabasePager()->setUpThreads(3, 1);

_viewer->getDatabasePager()->setTargetMaximumNumberOfPageLOD(2);

_viewer->getDatabasePager()->setUnrefImageDataAfterApplyPolicy(true, true);

}

//创建一个四边形节点

osg::ref_ptr<osg::Node> OsgMainApp::createNode() {

//创建一个叶节点对象

osg::ref_ptr<osg::Geode> geode = new osg::Geode();

//创建一个几何体对象

osg::ref_ptr<osg::Geometry> geom = new osg::Geometry();

//添加顶点数据 注意顶点的添加顺序是逆时针

osg::ref_ptr<osg::Vec3Array> v = new osg::Vec3Array();

//添加数据

v->push_back(osg::Vec3(0, 0, 0));

v->push_back(osg::Vec3(1, 0, 0));

v->push_back(osg::Vec3(1, 0, 1));

v->push_back(osg::Vec3(0, 0, 1));

//设置顶点数据

geom->setVertexArray(v.get());

//创建纹理订点数据

osg::ref_ptr<osg::Vec2Array> vt = new osg::Vec2Array();

//添加纹理坐标

vt->push_back(osg::Vec2(0, 0));

vt->push_back(osg::Vec2(1, 0));

vt->push_back(osg::Vec2(1, 1));

vt->push_back(osg::Vec2(0, 1));

//设置纹理坐标

geom->setTexCoordArray(0, vt.get());

//创建颜色数组

osg::ref_ptr<osg::Vec4Array> vc = new osg::Vec4Array();

//添加数据

vc->push_back(osg::Vec4(1, 0, 0, 1));

vc->push_back(osg::Vec4(0, 1, 0, 1));

vc->push_back(osg::Vec4(0, 0, 1, 1));

vc->push_back(osg::Vec4(1, 1, 0, 1));

//设置颜色数组

geom->setColorArray(vc.get());

//设置颜色的绑定方式为单个顶点

geom->setColorBinding(osg::Geometry::BIND_PER_VERTEX);

//创建法线数组

osg::ref_ptr<osg::Vec3Array> nc = new osg::Vec3Array();

//添加法线

nc->push_back(osg::Vec3(0, -1, 0));

//设置法线

geom->setNormalArray(nc.get());

//设置法绑定为全部顶点

geom->setNormalBinding(osg::Geometry::BIND_OVERALL);

//添加图元

geom->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::QUADS, 0, 4));

//添加到叶子节点

geode->addDrawable(geom.get());

return geode.get();

}

C++ Code
1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

/*

* OsgMainApp.h

*

* Created on: 2014-10-19

* Author: VCC

*/

#ifndef OSGMAINAPP_H_

#define OSGMAINAPP_H_

//android log

#include <android/log.h>

#include <iostream>

#include <cstdlib>

#include <math.h>

#include <string>

//osg

#include <osg/GL>

#include <osg/GLExtensions>

#include <osg/Depth>

#include <osg/Program>

#include <osg/Shader>

#include <osg/Node>

#include <osg/Notify>

#include <osg/ShapeDrawable>

#include <osgText/Text>

//osgDB

#include <osgDB/DatabasePager>

#include <osgDB/Registry>

#include <osgDB/ReadFile>

#include <osgDB/WriteFile>

//osg_viewer

#include <osgViewer/Viewer>

#include <osgViewer/Renderer>

#include <osgViewer/ViewerEventHandlers>

//osgGA

#include <osgGA/GUIEventAdapter>

#include <osgGA/MultiTouchTrackballManipulator>

#include <osgGA/TrackballManipulator>

#include <osgGA/FlightManipulator>

#include <osgGA/DriveManipulator>

#include <osgGA/KeySwitchMatrixManipulator>

#include <osgGA/StateSetManipulator>

#include <osgGA/AnimationPathManipulator>

#include <osgGA/TerrainManipulator>

#include <osgGA/SphericalManipulator>

//Static plugins Macro

USE_OSGPLUGIN(ive)

USE_OSGPLUGIN(osg)

USE_OSGPLUGIN(osg2)

USE_OSGPLUGIN(terrain)

USE_OSGPLUGIN(rgb)

USE_OSGPLUGIN(OpenFlight)

USE_OSGPLUGIN(dds)

//Static DOTOSG

USE_DOTOSGWRAPPER_LIBRARY(osg)

USE_DOTOSGWRAPPER_LIBRARY(osgFX)

USE_DOTOSGWRAPPER_LIBRARY(osgParticle)

USE_DOTOSGWRAPPER_LIBRARY(osgTerrain)

USE_DOTOSGWRAPPER_LIBRARY(osgText)

USE_DOTOSGWRAPPER_LIBRARY(osgViewer)

USE_DOTOSGWRAPPER_LIBRARY(osgVolume)

//Static serializer

USE_SERIALIZER_WRAPPER_LIBRARY(osg)

USE_SERIALIZER_WRAPPER_LIBRARY(osgAnimation)

USE_SERIALIZER_WRAPPER_LIBRARY(osgFX)

USE_SERIALIZER_WRAPPER_LIBRARY(osgManipulator)

USE_SERIALIZER_WRAPPER_LIBRARY(osgParticle)

USE_SERIALIZER_WRAPPER_LIBRARY(osgTerrain)

USE_SERIALIZER_WRAPPER_LIBRARY(osgText)

USE_SERIALIZER_WRAPPER_LIBRARY(osgVolume)

#define LOG_TAG "osgNativeLib"

#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)

#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)

static const char gVertexShader[] =

"void main() { \n"

" gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; \n"

"} \n";

static const char gFragmentShader[] =

"void main() { \n"

" gl_FragColor =vec4(0.4,0.4,0.8,1.0); \n"

"} \n";

class OsgMainApp {

private:

osg::ref_ptr<osgViewer::Viewer> _viewer;

osg::ref_ptr<osg::Group> _root;

osg::ref_ptr<osgGA::KeySwitchMatrixManipulator> _manipulator;

public:

OsgMainApp();

void initOsgWindow(int x,int y,int width,int height);

void draw();

private:

osg::ref_ptr<osg::Node> createNode();

void loadModels();

};

#endif /* OSGMAINAPP_H_ */

C++ Code
1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

#include <jni.h>

#include <string.h>

#include <osg/Node>

#include <iostream>

#include "OsgMainApp.h"

OsgMainApp mainApp;

extern "C"{

JNIEXPORT void JNICALL Java_com_example_helloosg_osgNativeLib_init(JNIEnv* env, jobject obj, jint width, jint height);

JNIEXPORT void JNICALL Java_com_example_helloosg_osgNativeLib_step(JNIEnv* env, jobject obj);

}

JNIEXPORT void JNICALL Java_com_example_helloosg_osgNativeLib_init(JNIEnv* env, jobject obj, jint width, jint height)

{

mainApp.initOsgWindow(0, 0, width, height);

}

JNIEXPORT void JNICALL Java_com_example_helloosg_osgNativeLib_step(JNIEnv* env, jobject obj){

mainApp.draw();

}
(3).mk文件

android.mk

C++ Code
1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := osgNativeLib

### Main Install dir

OSG_ANDROID_DIR := C:/Develop/osggles2

LIBDIR := $(OSG_ANDROID_DIR)/obj/local/armeabi

ifeq ($(TARGET_ARCH_ABI),armeabi-v7a)

LOCAL_ARM_NEON := true

LIBDIR := $(OSG_ANDROID_DIR)/obj/local/armeabi-v7a

endif

### Add all source file names to be included in lib separated by a whitespace

LOCAL_C_INCLUDES:= $(OSG_ANDROID_DIR)/include

LOCAL_CFLAGS := -fno-short-enums

LOCAL_CPPFLAGS := -DOSG_LIBRARY_STATIC

LOCAL_LDLIBS := -lGLESv2 -lz -llog

LOCAL_SRC_FILES := osgNativeLib.cpp OsgMainApp.cpp

LOCAL_LDFLAGS := -L $(LIBDIR) \

-losgdb_dds \

-losgdb_openflight \

-losgdb_tga \

-losgdb_rgb \

-losgdb_osgterrain \

-losgdb_osg \

-losgdb_ive \

-losgdb_deprecated_osgviewer \

-losgdb_deprecated_osgvolume \

-losgdb_deprecated_osgtext \

-losgdb_deprecated_osgterrain \

-losgdb_deprecated_osgsim \

-losgdb_deprecated_osgshadow \

-losgdb_deprecated_osgparticle \

-losgdb_deprecated_osgfx \

-losgdb_deprecated_osganimation \

-losgdb_deprecated_osg \

-losgdb_serializers_osgvolume \

-losgdb_serializers_osgtext \

-losgdb_serializers_osgterrain \

-losgdb_serializers_osgsim \

-losgdb_serializers_osgshadow \

-losgdb_serializers_osgparticle \

-losgdb_serializers_osgmanipulator \

-losgdb_serializers_osgfx \

-losgdb_serializers_osganimation \

-losgdb_serializers_osg \

-losgViewer \

-losgVolume \

-losgTerrain \

-losgText \

-losgShadow \

-losgSim \

-losgParticle \

-losgManipulator \

-losgGA \

-losgFX \

-losgDB \

-losgAnimation \

-losgUtil \

-losg \

-lOpenThreads \

-lgnustl_static

include $(BUILD_SHARED_LIBRARY)
application.mk

C++ Code
1

2

3

4

5

6

7

8

9

10

11

#ANDROID APPLICATION MAKEFILE

APP_BUILD_SCRIPT := $(call my-dir)/Android.mk

#APP_PROJECT_PATH := $(call my-dir)

APP_OPTIM := release

APP_PLATFORM := android-8

APP_STL := gnustl_static

APP_CPPFLAGS := -fexceptions -frtti

APP_ABI := armeabi armeabi-v7a

APP_MODULES := osgNativeLib
运行结果



注:由于代码是基于OpenGL ES2,简单加载了一个四边形,并在片元着色器将四边形的颜色赋为浅蓝色,其实也可以通过

OSG将四边形的颜色或者纹理赋到四边形上,具体下篇将说明
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: