初次提交
This commit is contained in:
7
第15章 真实光学环境的模拟/Sample15_7/.classpath
Normal file
7
第15章 真实光学环境的模拟/Sample15_7/.classpath
Normal file
@@ -0,0 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<classpath>
|
||||
<classpathentry kind="src" path="src"/>
|
||||
<classpathentry kind="src" path="gen"/>
|
||||
<classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
|
||||
<classpathentry kind="output" path="bin"/>
|
||||
</classpath>
|
||||
33
第15章 真实光学环境的模拟/Sample15_7/.project
Normal file
33
第15章 真实光学环境的模拟/Sample15_7/.project
Normal file
@@ -0,0 +1,33 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<projectDescription>
|
||||
<name>Sample15_7</name>
|
||||
<comment></comment>
|
||||
<projects>
|
||||
</projects>
|
||||
<buildSpec>
|
||||
<buildCommand>
|
||||
<name>com.android.ide.eclipse.adt.ResourceManagerBuilder</name>
|
||||
<arguments>
|
||||
</arguments>
|
||||
</buildCommand>
|
||||
<buildCommand>
|
||||
<name>com.android.ide.eclipse.adt.PreCompilerBuilder</name>
|
||||
<arguments>
|
||||
</arguments>
|
||||
</buildCommand>
|
||||
<buildCommand>
|
||||
<name>org.eclipse.jdt.core.javabuilder</name>
|
||||
<arguments>
|
||||
</arguments>
|
||||
</buildCommand>
|
||||
<buildCommand>
|
||||
<name>com.android.ide.eclipse.adt.ApkBuilder</name>
|
||||
<arguments>
|
||||
</arguments>
|
||||
</buildCommand>
|
||||
</buildSpec>
|
||||
<natures>
|
||||
<nature>com.android.ide.eclipse.adt.AndroidNature</nature>
|
||||
<nature>org.eclipse.jdt.core.javanature</nature>
|
||||
</natures>
|
||||
</projectDescription>
|
||||
@@ -0,0 +1,12 @@
|
||||
#Wed Jan 05 21:56:15 CST 2011
|
||||
eclipse.preferences.version=1
|
||||
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
|
||||
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
|
||||
org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
|
||||
org.eclipse.jdt.core.compiler.compliance=1.6
|
||||
org.eclipse.jdt.core.compiler.debug.lineNumber=generate
|
||||
org.eclipse.jdt.core.compiler.debug.localVariable=generate
|
||||
org.eclipse.jdt.core.compiler.debug.sourceFile=generate
|
||||
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
|
||||
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
|
||||
org.eclipse.jdt.core.compiler.source=1.6
|
||||
15
第15章 真实光学环境的模拟/Sample15_7/AndroidManifest.xml
Normal file
15
第15章 真实光学环境的模拟/Sample15_7/AndroidManifest.xml
Normal file
@@ -0,0 +1,15 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:versionCode="1"
|
||||
android:versionName="1.0" package="com.bn.Sample15_7">
|
||||
<application android:icon="@drawable/icon" android:label="@string/app_name">
|
||||
<activity android:name=".Sample15_7_Activity"
|
||||
android:label="@string/app_name">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN" />
|
||||
<category android:name="android.intent.category.LAUNCHER" />
|
||||
</intent-filter>
|
||||
</activity>
|
||||
</application>
|
||||
<uses-sdk android:targetSdkVersion="8"></uses-sdk>
|
||||
</manifest>
|
||||
30
第15章 真实光学环境的模拟/Sample15_7/assets/cft.obj
Normal file
30
第15章 真实光学环境的模拟/Sample15_7/assets/cft.obj
Normal file
@@ -0,0 +1,30 @@
|
||||
# Max2Obj Version 4.0 Mar 10th, 2001
|
||||
#
|
||||
# object (null) to come ...
|
||||
#
|
||||
v -3.681371 -0.000000 3.975810
|
||||
v 3.654120 -0.000000 3.975810
|
||||
v -3.681371 -0.000000 -3.988921
|
||||
v 3.654120 -0.000000 -3.988921
|
||||
v -3.681371 8.567677 3.975810
|
||||
v 3.654120 8.567677 3.975810
|
||||
v -3.681371 8.567677 -3.988921
|
||||
v 3.654120 8.567677 -3.988921
|
||||
# 8 vertices
|
||||
|
||||
g (null)
|
||||
f 1 3 4
|
||||
f 4 2 1
|
||||
f 5 6 8
|
||||
f 8 7 5
|
||||
f 1 2 6
|
||||
f 6 5 1
|
||||
f 2 4 8
|
||||
f 8 6 2
|
||||
f 4 3 7
|
||||
f 7 8 4
|
||||
f 3 1 5
|
||||
f 5 7 3
|
||||
# 12 faces
|
||||
|
||||
g
|
||||
1532
第15章 真实光学环境的模拟/Sample15_7/assets/ch.obj
Normal file
1532
第15章 真实光学环境的模拟/Sample15_7/assets/ch.obj
Normal file
File diff suppressed because it is too large
Load Diff
14
第15章 真实光学环境的模拟/Sample15_7/assets/frag_shadow.sh
Normal file
14
第15章 真实光学环境的模拟/Sample15_7/assets/frag_shadow.sh
Normal file
@@ -0,0 +1,14 @@
|
||||
precision mediump float; //给出默认的浮点精度
|
||||
uniform highp int isShadow; //阴影绘制标志
|
||||
varying vec4 ambient; //从顶点着色器传递过来的环境光最终强度
|
||||
varying vec4 diffuse; //从顶点着色器传递过来的散射光最终强度
|
||||
varying vec4 specular; //从顶点着色器传递过来的镜面光最终强度
|
||||
void main() {
|
||||
if(isShadow==0){ //绘制物体本身
|
||||
vec4 finalColor=vec4(1.0,1.0,1.0,0.0); //物体本身的颜色
|
||||
//综合三个通道光的最终强度及片元的颜色计算出最终片元的颜色并传递给管线
|
||||
gl_FragColor = finalColor*ambient+finalColor*specular+finalColor*diffuse;
|
||||
}else{ //绘制阴影
|
||||
gl_FragColor = vec4(0.2,0.2,0.2,0.0);;//片元最终颜色为阴影的颜色
|
||||
}
|
||||
}
|
||||
67
第15章 真实光学环境的模拟/Sample15_7/assets/pm.obj
Normal file
67
第15章 真实光学环境的模拟/Sample15_7/assets/pm.obj
Normal file
@@ -0,0 +1,67 @@
|
||||
# Max2Obj Version 4.0 Mar 10th, 2001
|
||||
#
|
||||
# object (null) to come ...
|
||||
#
|
||||
v -61.054153 0.000000 60.416534
|
||||
v -30.540934 0.000000 60.416534
|
||||
v -0.027714 0.000000 60.416534
|
||||
v 30.485506 0.000000 60.416534
|
||||
v 60.998726 0.000000 60.416534
|
||||
v -61.054153 0.000000 30.207113
|
||||
v -30.540934 0.000000 30.207113
|
||||
v -0.027714 0.000000 30.207113
|
||||
v 30.485506 0.000000 30.207113
|
||||
v 60.998726 0.000000 30.207113
|
||||
v -61.054153 0.000000 -0.002306
|
||||
v -30.540934 0.000000 -0.002306
|
||||
v -0.027714 0.000000 -0.002306
|
||||
v 30.485506 0.000000 -0.002306
|
||||
v 60.998726 0.000000 -0.002306
|
||||
v -61.054153 0.000000 -30.211725
|
||||
v -30.540934 0.000000 -30.211725
|
||||
v -0.027714 0.000000 -30.211725
|
||||
v 30.485506 0.000000 -30.211725
|
||||
v 60.998726 0.000000 -30.211725
|
||||
v -61.054153 0.000000 -60.421146
|
||||
v -30.540934 0.000000 -60.421146
|
||||
v -0.027714 0.000000 -60.421146
|
||||
v 30.485506 0.000000 -60.421146
|
||||
v 60.998726 0.000000 -60.421146
|
||||
# 25 vertices
|
||||
|
||||
g (null)
|
||||
f 6 1 7
|
||||
f 2 7 1
|
||||
f 7 2 8
|
||||
f 3 8 2
|
||||
f 8 3 9
|
||||
f 4 9 3
|
||||
f 9 4 10
|
||||
f 5 10 4
|
||||
f 11 6 12
|
||||
f 7 12 6
|
||||
f 12 7 13
|
||||
f 8 13 7
|
||||
f 13 8 14
|
||||
f 9 14 8
|
||||
f 14 9 15
|
||||
f 10 15 9
|
||||
f 16 11 17
|
||||
f 12 17 11
|
||||
f 17 12 18
|
||||
f 13 18 12
|
||||
f 18 13 19
|
||||
f 14 19 13
|
||||
f 19 14 20
|
||||
f 15 20 14
|
||||
f 21 16 22
|
||||
f 17 22 16
|
||||
f 22 17 23
|
||||
f 18 23 17
|
||||
f 23 18 24
|
||||
f 19 24 18
|
||||
f 24 19 25
|
||||
f 20 25 19
|
||||
# 32 faces
|
||||
|
||||
g
|
||||
1452
第15章 真实光学环境的模拟/Sample15_7/assets/qt.obj
Normal file
1452
第15章 真实光学环境的模拟/Sample15_7/assets/qt.obj
Normal file
File diff suppressed because it is too large
Load Diff
59
第15章 真实光学环境的模拟/Sample15_7/assets/vertex_shadow.sh
Normal file
59
第15章 真实光学环境的模拟/Sample15_7/assets/vertex_shadow.sh
Normal file
@@ -0,0 +1,59 @@
|
||||
uniform int isShadow;//阴影绘制标志
|
||||
uniform mat4 uMVPMatrix; //总变换矩阵
|
||||
uniform mat4 uMMatrix; //变换矩阵
|
||||
uniform mat4 uMProjCameraMatrix; //投影、摄像机组合矩阵
|
||||
uniform vec3 uLightLocation; //光源位置
|
||||
uniform vec3 uCamera; //摄像机位置
|
||||
attribute vec3 aPosition; //顶点位置
|
||||
attribute vec3 aNormal; //顶点法向量
|
||||
varying vec4 ambient;
|
||||
varying vec4 diffuse;
|
||||
varying vec4 specular;
|
||||
//定位光光照计算的方法
|
||||
void pointLight( //定位光光照计算的方法
|
||||
in vec3 normal, //法向量
|
||||
inout vec4 ambient, //环境光最终强度
|
||||
inout vec4 diffuse, //散射光最终强度
|
||||
inout vec4 specular, //镜面光最终强度
|
||||
in vec3 lightLocation, //光源位置
|
||||
in vec4 lightAmbient, //环境光强度
|
||||
in vec4 lightDiffuse, //散射光强度
|
||||
in vec4 lightSpecular //镜面光强度
|
||||
){
|
||||
ambient=lightAmbient; //直接得出环境光的最终强度
|
||||
vec3 normalTarget=aPosition+normal; //计算变换后的法向量
|
||||
vec3 newNormal=(uMMatrix*vec4(normalTarget,1)).xyz-(uMMatrix*vec4(aPosition,1)).xyz;
|
||||
newNormal=normalize(newNormal); //对法向量规格化
|
||||
//计算从表面点到摄像机的向量
|
||||
vec3 eye= normalize(uCamera-(uMMatrix*vec4(aPosition,1)).xyz);
|
||||
//计算从表面点到光源位置的向量vp
|
||||
vec3 vp= normalize(lightLocation-(uMMatrix*vec4(aPosition,1)).xyz);
|
||||
vp=normalize(vp);//格式化vp
|
||||
vec3 halfVector=normalize(vp+eye); //求视线与光线的半向量
|
||||
float shininess=50.0; //粗糙度,越小越光滑
|
||||
float nDotViewPosition=max(0.0,dot(newNormal,vp)); //求法向量与vp的点积与0的最大值
|
||||
diffuse=lightDiffuse*nDotViewPosition; //计算散射光的最终强度
|
||||
float nDotViewHalfVector=dot(newNormal,halfVector); //法线与半向量的点积
|
||||
float powerFactor=max(0.0,pow(nDotViewHalfVector,shininess)); //镜面反射光强度因子
|
||||
specular=lightSpecular*powerFactor; //计算镜面光的最终强度
|
||||
}
|
||||
|
||||
void main()
|
||||
{
|
||||
if(isShadow==1)
|
||||
{//绘制本影,计算阴影顶点位置
|
||||
vec3 A=vec3(0.0,0.1,0.0);//投影平面上任一点坐标
|
||||
vec3 n=vec3(0.0,1.0,0.0);//投影平面法向量
|
||||
vec3 S=uLightLocation; //光源位置
|
||||
vec3 V=(uMMatrix*vec4(aPosition,1)).xyz; //经过平移和旋转变换后的点的坐标
|
||||
vec3 VL=S+(V-S)*(dot(n,(A-S))/dot(n,(V-S)));//求得的投影点坐标
|
||||
gl_Position = uMProjCameraMatrix*vec4(VL,1); //根据总变换矩阵计算此次绘制此顶点位置
|
||||
}
|
||||
else
|
||||
{
|
||||
gl_Position = uMVPMatrix * vec4(aPosition,1); //根据总变换矩阵计算此次绘制此顶点位置
|
||||
}
|
||||
|
||||
pointLight(normalize(aNormal),ambient,diffuse,specular,uLightLocation,vec4(0.4,0.4,0.4,1.0),vec4(0.7,0.7,0.7,1.0),vec4(0.3,0.3,0.3,1.0));
|
||||
|
||||
}
|
||||
874
第15章 真实光学环境的模拟/Sample15_7/assets/yh.obj
Normal file
874
第15章 真实光学环境的模拟/Sample15_7/assets/yh.obj
Normal file
@@ -0,0 +1,874 @@
|
||||
# Max2Obj Version 4.0 Mar 10th, 2001
|
||||
#
|
||||
# object (null) to come ...
|
||||
#
|
||||
v -0.052045 11.934561 -0.071060
|
||||
v -0.052045 11.728649 1.039199
|
||||
v -0.052045 11.130157 1.857216
|
||||
v -0.052045 10.299451 2.163805
|
||||
v -0.052045 9.459118 1.876815
|
||||
v -0.052045 8.834325 1.073145
|
||||
v -0.052045 8.592483 -0.031862
|
||||
v -0.052045 8.798395 -1.142120
|
||||
v -0.052045 9.396887 -1.960137
|
||||
v -0.052045 10.227592 -2.266726
|
||||
v -0.052045 11.067925 -1.979736
|
||||
v -0.052045 11.692719 -1.176066
|
||||
v 1.589505 11.722996 -0.068578
|
||||
v 1.530315 11.524712 1.041591
|
||||
v 1.368607 10.947062 1.859363
|
||||
v 1.147708 10.144825 2.165618
|
||||
v 0.926810 9.332962 1.878294
|
||||
v 0.765101 8.729010 1.074380
|
||||
v 0.705912 8.494797 -0.030716
|
||||
v 0.765101 8.693080 -1.140885
|
||||
v 0.926810 9.270731 -1.958658
|
||||
v 1.147708 10.072968 -2.264912
|
||||
v 1.368607 10.884830 -1.977588
|
||||
v 1.530315 11.488783 -1.173674
|
||||
v 3.119186 11.102718 -0.061303
|
||||
v 3.004841 10.926801 1.048603
|
||||
v 2.692443 10.410254 1.865659
|
||||
v 2.265701 9.691486 2.170935
|
||||
v 1.838958 8.963092 1.882632
|
||||
v 1.526560 8.420242 1.078002
|
||||
v 1.412215 8.208395 -0.027357
|
||||
v 1.526561 8.384314 -1.137264
|
||||
v 1.838958 8.900861 -1.954320
|
||||
v 2.265701 9.619628 -2.259595
|
||||
v 2.692443 10.348022 -1.971292
|
||||
v 3.004841 10.890872 -1.166662
|
||||
v 4.432753 10.116001 -0.049730
|
||||
v 4.271044 9.975660 1.059759
|
||||
v 3.829248 9.556314 1.875675
|
||||
v 3.225742 8.970327 2.179393
|
||||
v 2.622237 8.374712 1.889533
|
||||
v 2.180440 7.929064 1.083762
|
||||
v 2.018731 7.752795 -0.022014
|
||||
v 2.180440 7.893135 -1.131503
|
||||
v 2.622237 8.312481 -1.947419
|
||||
v 3.225742 8.898469 -2.251137
|
||||
v 3.829248 9.494084 -1.961277
|
||||
v 4.271045 9.939732 -1.155506
|
||||
v 5.440689 8.830085 -0.034648
|
||||
v 5.242637 8.736112 1.074297
|
||||
v 4.701548 8.443440 1.888727
|
||||
v 3.962408 8.030495 2.190416
|
||||
v 3.223268 7.607922 1.898527
|
||||
v 2.682180 7.288949 1.091270
|
||||
v 2.484128 7.159046 -0.015050
|
||||
v 2.682180 7.253020 -1.123995
|
||||
v 3.223268 7.545691 -1.938425
|
||||
v 3.962408 7.958636 -2.240114
|
||||
v 4.701549 8.381209 -1.948224
|
||||
v 5.242637 8.700182 -1.140968
|
||||
v 6.074303 7.332604 -0.017085
|
||||
v 5.853405 7.292625 1.091227
|
||||
v 5.249900 7.147471 1.903927
|
||||
v 4.425496 6.936037 2.203253
|
||||
v 3.601092 6.714975 1.909000
|
||||
v 2.997587 6.543519 1.100013
|
||||
v 2.776688 6.467611 -0.006940
|
||||
v 2.997586 6.507590 -1.115252
|
||||
v 3.601092 6.652744 -1.927952
|
||||
v 4.425496 6.864178 -2.227278
|
||||
v 5.249900 7.085240 -1.933025
|
||||
v 5.853405 7.256696 -1.124038
|
||||
v 6.290418 5.725609 0.001763
|
||||
v 6.061727 5.743574 1.109395
|
||||
v 5.436932 5.756725 1.920239
|
||||
v 4.583447 5.761539 2.217028
|
||||
v 3.729961 5.756725 1.920238
|
||||
v 3.105166 5.743574 1.109395
|
||||
v 2.876475 5.725609 0.001762
|
||||
v 3.105166 5.707644 -1.105870
|
||||
v 3.729961 5.694494 -1.916713
|
||||
v 4.583447 5.689680 -2.213503
|
||||
v 5.436932 5.694494 -1.916713
|
||||
v 6.061727 5.707644 -1.105870
|
||||
v 6.074303 4.118615 0.020610
|
||||
v 5.853405 4.194523 1.127563
|
||||
v 5.249900 4.365978 1.936550
|
||||
v 4.425496 4.587040 2.230803
|
||||
v 3.601092 4.798475 1.931477
|
||||
v 2.997587 4.943629 1.118777
|
||||
v 2.776688 4.983608 0.010465
|
||||
v 2.997586 4.907700 -1.096488
|
||||
v 3.601092 4.736244 -1.905475
|
||||
v 4.425496 4.515182 -2.199727
|
||||
v 5.249900 4.303747 -1.900401
|
||||
v 5.853405 4.158594 -1.087701
|
||||
v 5.440689 2.621134 0.038174
|
||||
v 5.242637 2.751037 1.144493
|
||||
v 4.701548 3.070009 1.951750
|
||||
v 3.962408 3.492582 2.243639
|
||||
v 3.223268 3.905528 1.941950
|
||||
v 2.682180 4.198199 1.127520
|
||||
v 2.484128 4.292172 0.018575
|
||||
v 2.682180 4.162270 -1.087745
|
||||
v 3.223268 3.843297 -1.895002
|
||||
v 3.962408 3.420724 -2.186891
|
||||
v 4.701549 3.007778 -1.885202
|
||||
v 5.242637 2.715107 -1.070771
|
||||
v 4.432753 1.335218 0.053256
|
||||
v 4.271044 1.511487 1.159032
|
||||
v 3.829248 1.957135 1.964802
|
||||
v 3.225742 2.552750 2.254662
|
||||
v 2.622237 3.138738 1.950944
|
||||
v 2.180440 3.558083 1.135028
|
||||
v 2.018731 3.698424 0.025538
|
||||
v 2.180440 3.522154 -1.080237
|
||||
v 2.622237 3.076506 -1.886008
|
||||
v 3.225742 2.480891 -2.175868
|
||||
v 3.829248 1.894903 -1.872149
|
||||
v 4.271045 1.475558 -1.056233
|
||||
v 3.119186 0.348500 0.064829
|
||||
v 3.004841 0.560347 1.170187
|
||||
v 2.692443 1.103196 1.974818
|
||||
v 2.265701 1.831591 2.263121
|
||||
v 1.838958 2.550358 1.957845
|
||||
v 1.526560 3.066905 1.140789
|
||||
v 1.412215 3.242824 0.030882
|
||||
v 1.526561 3.030976 -1.074477
|
||||
v 1.838958 2.488127 -1.879107
|
||||
v 2.265701 1.759732 -2.167410
|
||||
v 2.692443 1.040965 -1.862134
|
||||
v 3.004841 0.524417 -1.045078
|
||||
v 1.589505 -0.271777 0.072103
|
||||
v 1.530315 -0.037564 1.177200
|
||||
v 1.368607 0.566388 1.981114
|
||||
v 1.147708 1.378252 2.268438
|
||||
v 0.926810 2.180488 1.962183
|
||||
v 0.765101 2.758138 1.144410
|
||||
v 0.705912 2.956422 0.034241
|
||||
v 0.765101 2.722209 -1.070855
|
||||
v 0.926810 2.118257 -1.874769
|
||||
v 1.147708 1.306393 -2.162093
|
||||
v 1.368607 0.504157 -1.855838
|
||||
v 1.530315 -0.073493 -1.038065
|
||||
v -0.052045 -0.483342 0.074585
|
||||
v -0.052045 -0.241501 1.179592
|
||||
v -0.052045 0.383293 1.983261
|
||||
v -0.052045 1.223626 2.270251
|
||||
v -0.052045 2.054332 1.963662
|
||||
v -0.052045 2.652823 1.145645
|
||||
v -0.052045 2.858736 0.035387
|
||||
v -0.052045 2.616894 -1.069620
|
||||
v -0.052045 1.992100 -1.873290
|
||||
v -0.052045 1.151767 -2.160279
|
||||
v -0.052045 0.321062 -1.853690
|
||||
v -0.052045 -0.277430 -1.035673
|
||||
v -1.693596 -0.271777 0.072103
|
||||
v -1.634406 -0.037564 1.177200
|
||||
v -1.472697 0.566388 1.981114
|
||||
v -1.251799 1.378252 2.268438
|
||||
v -1.030900 2.180488 1.962183
|
||||
v -0.869191 2.758138 1.144410
|
||||
v -0.810002 2.956422 0.034241
|
||||
v -0.869192 2.722209 -1.070855
|
||||
v -1.030900 2.118257 -1.874769
|
||||
v -1.251799 1.306393 -2.162093
|
||||
v -1.472697 0.504157 -1.855838
|
||||
v -1.634406 -0.073493 -1.038065
|
||||
v -3.223277 0.348500 0.064828
|
||||
v -3.108931 0.560347 1.170187
|
||||
v -2.796534 1.103197 1.974818
|
||||
v -2.369791 1.831591 2.263120
|
||||
v -1.943048 2.550359 1.957845
|
||||
v -1.630651 3.066906 1.140789
|
||||
v -1.516305 3.242824 0.030882
|
||||
v -1.630651 3.030976 -1.074477
|
||||
v -1.943048 2.488127 -1.879107
|
||||
v -2.369791 1.759732 -2.167410
|
||||
v -2.796534 1.040965 -1.862134
|
||||
v -3.108931 0.524418 -1.045078
|
||||
v -4.536844 1.335218 0.053256
|
||||
v -4.375134 1.511488 1.159032
|
||||
v -3.933338 1.957135 1.964802
|
||||
v -3.329832 2.552750 2.254662
|
||||
v -2.726327 3.138738 1.950944
|
||||
v -2.284530 3.558084 1.135028
|
||||
v -2.122822 3.698424 0.025538
|
||||
v -2.284531 3.522154 -1.080238
|
||||
v -2.726327 3.076506 -1.886008
|
||||
v -3.329833 2.480892 -2.175868
|
||||
v -3.933338 1.894904 -1.872149
|
||||
v -4.375135 1.475558 -1.056233
|
||||
v -5.544779 2.621134 0.038174
|
||||
v -5.346727 2.751037 1.144493
|
||||
v -4.805639 3.070009 1.951750
|
||||
v -4.066498 3.492583 2.243639
|
||||
v -3.327358 3.905529 1.941950
|
||||
v -2.786270 4.198199 1.127520
|
||||
v -2.588218 4.292172 0.018575
|
||||
v -2.786270 4.162270 -1.087745
|
||||
v -3.327358 3.843297 -1.895002
|
||||
v -4.066499 3.420724 -2.186891
|
||||
v -4.805639 3.007778 -1.885202
|
||||
v -5.346727 2.715108 -1.070771
|
||||
v -6.178394 4.118615 0.020610
|
||||
v -5.957495 4.194523 1.127563
|
||||
v -5.353990 4.365979 1.936550
|
||||
v -4.529586 4.587041 2.230803
|
||||
v -3.705182 4.798475 1.931477
|
||||
v -3.101676 4.943629 1.118777
|
||||
v -2.880779 4.983608 0.010465
|
||||
v -3.101677 4.907700 -1.096488
|
||||
v -3.705183 4.736244 -1.905475
|
||||
v -4.529586 4.515182 -2.199727
|
||||
v -5.353990 4.303748 -1.900402
|
||||
v -5.957495 4.158594 -1.087702
|
||||
v -6.394508 5.725610 0.001763
|
||||
v -6.165817 5.743575 1.109395
|
||||
v -5.541022 5.756725 1.920238
|
||||
v -4.687536 5.761539 2.217028
|
||||
v -3.834051 5.756725 1.920238
|
||||
v -3.209256 5.743574 1.109395
|
||||
v -2.980565 5.725610 0.001762
|
||||
v -3.209256 5.707645 -1.105870
|
||||
v -3.834051 5.694494 -1.916713
|
||||
v -4.687537 5.689681 -2.213503
|
||||
v -5.541022 5.694494 -1.916713
|
||||
v -6.165817 5.707645 -1.105870
|
||||
v -6.178393 7.332605 -0.017085
|
||||
v -5.957495 7.292626 1.091227
|
||||
v -5.353990 7.147472 1.903927
|
||||
v -4.529586 6.936037 2.203253
|
||||
v -3.705182 6.714975 1.909000
|
||||
v -3.101676 6.543519 1.100013
|
||||
v -2.880778 6.467611 -0.006940
|
||||
v -3.101677 6.507590 -1.115252
|
||||
v -3.705182 6.652744 -1.927952
|
||||
v -4.529586 6.864179 -2.227278
|
||||
v -5.353990 7.085241 -1.933025
|
||||
v -5.957495 7.256697 -1.124038
|
||||
v -5.544778 8.830086 -0.034648
|
||||
v -5.346726 8.736112 1.074297
|
||||
v -4.805638 8.443441 1.888727
|
||||
v -4.066498 8.030495 2.190416
|
||||
v -3.327358 7.607922 1.898527
|
||||
v -2.786270 7.288949 1.091270
|
||||
v -2.588218 7.159046 -0.015050
|
||||
v -2.786270 7.253020 -1.123995
|
||||
v -3.327358 7.545691 -1.938425
|
||||
v -4.066498 7.958637 -2.240114
|
||||
v -4.805638 8.381210 -1.948224
|
||||
v -5.346726 8.700182 -1.140968
|
||||
v -4.536843 10.116001 -0.049730
|
||||
v -4.375134 9.975661 1.059759
|
||||
v -3.933337 9.556315 1.875675
|
||||
v -3.329832 8.970327 2.179393
|
||||
v -2.726326 8.374712 1.889533
|
||||
v -2.284530 7.929065 1.083762
|
||||
v -2.122821 7.752795 -0.022014
|
||||
v -2.284530 7.893136 -1.131503
|
||||
v -2.726327 8.312481 -1.947419
|
||||
v -3.329832 8.898469 -2.251137
|
||||
v -3.933338 9.494084 -1.961277
|
||||
v -4.375134 9.939732 -1.155506
|
||||
v -3.223276 11.102718 -0.061303
|
||||
v -3.108930 10.926801 1.048603
|
||||
v -2.796533 10.410254 1.865659
|
||||
v -2.369790 9.691486 2.170935
|
||||
v -1.943048 8.963092 1.882632
|
||||
v -1.630650 8.420242 1.078002
|
||||
v -1.516305 8.208395 -0.027357
|
||||
v -1.630650 8.384314 -1.137264
|
||||
v -1.943048 8.900861 -1.954320
|
||||
v -2.369790 9.619628 -2.259595
|
||||
v -2.796533 10.348022 -1.971292
|
||||
v -3.108930 10.890872 -1.166662
|
||||
v -1.693594 11.722996 -0.068578
|
||||
v -1.634405 11.524712 1.041591
|
||||
v -1.472696 10.947062 1.859363
|
||||
v -1.251798 10.144826 2.165618
|
||||
v -1.030900 9.332962 1.878294
|
||||
v -0.869191 8.729010 1.074380
|
||||
v -0.810001 8.494797 -0.030716
|
||||
v -0.869191 8.693081 -1.140885
|
||||
v -1.030900 9.270731 -1.958658
|
||||
v -1.251798 10.072968 -2.264912
|
||||
v -1.472696 10.884830 -1.977588
|
||||
v -1.634405 11.488783 -1.173674
|
||||
# 288 vertices
|
||||
|
||||
g (null)
|
||||
f 1 14 13
|
||||
f 1 2 14
|
||||
f 2 15 14
|
||||
f 2 3 15
|
||||
f 3 16 15
|
||||
f 3 4 16
|
||||
f 4 17 16
|
||||
f 4 5 17
|
||||
f 5 18 17
|
||||
f 5 6 18
|
||||
f 6 19 18
|
||||
f 6 7 19
|
||||
f 7 20 19
|
||||
f 7 8 20
|
||||
f 8 21 20
|
||||
f 8 9 21
|
||||
f 9 22 21
|
||||
f 9 10 22
|
||||
f 10 23 22
|
||||
f 10 11 23
|
||||
f 11 24 23
|
||||
f 11 12 24
|
||||
f 12 13 24
|
||||
f 12 1 13
|
||||
f 13 26 25
|
||||
f 13 14 26
|
||||
f 14 27 26
|
||||
f 14 15 27
|
||||
f 15 28 27
|
||||
f 15 16 28
|
||||
f 16 29 28
|
||||
f 16 17 29
|
||||
f 17 30 29
|
||||
f 17 18 30
|
||||
f 18 31 30
|
||||
f 18 19 31
|
||||
f 19 32 31
|
||||
f 19 20 32
|
||||
f 20 33 32
|
||||
f 20 21 33
|
||||
f 21 34 33
|
||||
f 21 22 34
|
||||
f 22 35 34
|
||||
f 22 23 35
|
||||
f 23 36 35
|
||||
f 23 24 36
|
||||
f 24 25 36
|
||||
f 24 13 25
|
||||
f 25 38 37
|
||||
f 25 26 38
|
||||
f 26 39 38
|
||||
f 26 27 39
|
||||
f 27 40 39
|
||||
f 27 28 40
|
||||
f 28 41 40
|
||||
f 28 29 41
|
||||
f 29 42 41
|
||||
f 29 30 42
|
||||
f 30 43 42
|
||||
f 30 31 43
|
||||
f 31 44 43
|
||||
f 31 32 44
|
||||
f 32 45 44
|
||||
f 32 33 45
|
||||
f 33 46 45
|
||||
f 33 34 46
|
||||
f 34 47 46
|
||||
f 34 35 47
|
||||
f 35 48 47
|
||||
f 35 36 48
|
||||
f 36 37 48
|
||||
f 36 25 37
|
||||
f 37 50 49
|
||||
f 37 38 50
|
||||
f 38 51 50
|
||||
f 38 39 51
|
||||
f 39 52 51
|
||||
f 39 40 52
|
||||
f 40 53 52
|
||||
f 40 41 53
|
||||
f 41 54 53
|
||||
f 41 42 54
|
||||
f 42 55 54
|
||||
f 42 43 55
|
||||
f 43 56 55
|
||||
f 43 44 56
|
||||
f 44 57 56
|
||||
f 44 45 57
|
||||
f 45 58 57
|
||||
f 45 46 58
|
||||
f 46 59 58
|
||||
f 46 47 59
|
||||
f 47 60 59
|
||||
f 47 48 60
|
||||
f 48 49 60
|
||||
f 48 37 49
|
||||
f 49 62 61
|
||||
f 49 50 62
|
||||
f 50 63 62
|
||||
f 50 51 63
|
||||
f 51 64 63
|
||||
f 51 52 64
|
||||
f 52 65 64
|
||||
f 52 53 65
|
||||
f 53 66 65
|
||||
f 53 54 66
|
||||
f 54 67 66
|
||||
f 54 55 67
|
||||
f 55 68 67
|
||||
f 55 56 68
|
||||
f 56 69 68
|
||||
f 56 57 69
|
||||
f 57 70 69
|
||||
f 57 58 70
|
||||
f 58 71 70
|
||||
f 58 59 71
|
||||
f 59 72 71
|
||||
f 59 60 72
|
||||
f 60 61 72
|
||||
f 60 49 61
|
||||
f 61 74 73
|
||||
f 61 62 74
|
||||
f 62 75 74
|
||||
f 62 63 75
|
||||
f 63 76 75
|
||||
f 63 64 76
|
||||
f 64 77 76
|
||||
f 64 65 77
|
||||
f 65 78 77
|
||||
f 65 66 78
|
||||
f 66 79 78
|
||||
f 66 67 79
|
||||
f 67 80 79
|
||||
f 67 68 80
|
||||
f 68 81 80
|
||||
f 68 69 81
|
||||
f 69 82 81
|
||||
f 69 70 82
|
||||
f 70 83 82
|
||||
f 70 71 83
|
||||
f 71 84 83
|
||||
f 71 72 84
|
||||
f 72 73 84
|
||||
f 72 61 73
|
||||
f 73 86 85
|
||||
f 73 74 86
|
||||
f 74 87 86
|
||||
f 74 75 87
|
||||
f 75 88 87
|
||||
f 75 76 88
|
||||
f 76 89 88
|
||||
f 76 77 89
|
||||
f 77 90 89
|
||||
f 77 78 90
|
||||
f 78 91 90
|
||||
f 78 79 91
|
||||
f 79 92 91
|
||||
f 79 80 92
|
||||
f 80 93 92
|
||||
f 80 81 93
|
||||
f 81 94 93
|
||||
f 81 82 94
|
||||
f 82 95 94
|
||||
f 82 83 95
|
||||
f 83 96 95
|
||||
f 83 84 96
|
||||
f 84 85 96
|
||||
f 84 73 85
|
||||
f 85 98 97
|
||||
f 85 86 98
|
||||
f 86 99 98
|
||||
f 86 87 99
|
||||
f 87 100 99
|
||||
f 87 88 100
|
||||
f 88 101 100
|
||||
f 88 89 101
|
||||
f 89 102 101
|
||||
f 89 90 102
|
||||
f 90 103 102
|
||||
f 90 91 103
|
||||
f 91 104 103
|
||||
f 91 92 104
|
||||
f 92 105 104
|
||||
f 92 93 105
|
||||
f 93 106 105
|
||||
f 93 94 106
|
||||
f 94 107 106
|
||||
f 94 95 107
|
||||
f 95 108 107
|
||||
f 95 96 108
|
||||
f 96 97 108
|
||||
f 96 85 97
|
||||
f 97 110 109
|
||||
f 97 98 110
|
||||
f 98 111 110
|
||||
f 98 99 111
|
||||
f 99 112 111
|
||||
f 99 100 112
|
||||
f 100 113 112
|
||||
f 100 101 113
|
||||
f 101 114 113
|
||||
f 101 102 114
|
||||
f 102 115 114
|
||||
f 102 103 115
|
||||
f 103 116 115
|
||||
f 103 104 116
|
||||
f 104 117 116
|
||||
f 104 105 117
|
||||
f 105 118 117
|
||||
f 105 106 118
|
||||
f 106 119 118
|
||||
f 106 107 119
|
||||
f 107 120 119
|
||||
f 107 108 120
|
||||
f 108 109 120
|
||||
f 108 97 109
|
||||
f 109 122 121
|
||||
f 109 110 122
|
||||
f 110 123 122
|
||||
f 110 111 123
|
||||
f 111 124 123
|
||||
f 111 112 124
|
||||
f 112 125 124
|
||||
f 112 113 125
|
||||
f 113 126 125
|
||||
f 113 114 126
|
||||
f 114 127 126
|
||||
f 114 115 127
|
||||
f 115 128 127
|
||||
f 115 116 128
|
||||
f 116 129 128
|
||||
f 116 117 129
|
||||
f 117 130 129
|
||||
f 117 118 130
|
||||
f 118 131 130
|
||||
f 118 119 131
|
||||
f 119 132 131
|
||||
f 119 120 132
|
||||
f 120 121 132
|
||||
f 120 109 121
|
||||
f 121 134 133
|
||||
f 121 122 134
|
||||
f 122 135 134
|
||||
f 122 123 135
|
||||
f 123 136 135
|
||||
f 123 124 136
|
||||
f 124 137 136
|
||||
f 124 125 137
|
||||
f 125 138 137
|
||||
f 125 126 138
|
||||
f 126 139 138
|
||||
f 126 127 139
|
||||
f 127 140 139
|
||||
f 127 128 140
|
||||
f 128 141 140
|
||||
f 128 129 141
|
||||
f 129 142 141
|
||||
f 129 130 142
|
||||
f 130 143 142
|
||||
f 130 131 143
|
||||
f 131 144 143
|
||||
f 131 132 144
|
||||
f 132 133 144
|
||||
f 132 121 133
|
||||
f 133 146 145
|
||||
f 133 134 146
|
||||
f 134 147 146
|
||||
f 134 135 147
|
||||
f 135 148 147
|
||||
f 135 136 148
|
||||
f 136 149 148
|
||||
f 136 137 149
|
||||
f 137 150 149
|
||||
f 137 138 150
|
||||
f 138 151 150
|
||||
f 138 139 151
|
||||
f 139 152 151
|
||||
f 139 140 152
|
||||
f 140 153 152
|
||||
f 140 141 153
|
||||
f 141 154 153
|
||||
f 141 142 154
|
||||
f 142 155 154
|
||||
f 142 143 155
|
||||
f 143 156 155
|
||||
f 143 144 156
|
||||
f 144 145 156
|
||||
f 144 133 145
|
||||
f 145 158 157
|
||||
f 145 146 158
|
||||
f 146 159 158
|
||||
f 146 147 159
|
||||
f 147 160 159
|
||||
f 147 148 160
|
||||
f 148 161 160
|
||||
f 148 149 161
|
||||
f 149 162 161
|
||||
f 149 150 162
|
||||
f 150 163 162
|
||||
f 150 151 163
|
||||
f 151 164 163
|
||||
f 151 152 164
|
||||
f 152 165 164
|
||||
f 152 153 165
|
||||
f 153 166 165
|
||||
f 153 154 166
|
||||
f 154 167 166
|
||||
f 154 155 167
|
||||
f 155 168 167
|
||||
f 155 156 168
|
||||
f 156 157 168
|
||||
f 156 145 157
|
||||
f 157 170 169
|
||||
f 157 158 170
|
||||
f 158 171 170
|
||||
f 158 159 171
|
||||
f 159 172 171
|
||||
f 159 160 172
|
||||
f 160 173 172
|
||||
f 160 161 173
|
||||
f 161 174 173
|
||||
f 161 162 174
|
||||
f 162 175 174
|
||||
f 162 163 175
|
||||
f 163 176 175
|
||||
f 163 164 176
|
||||
f 164 177 176
|
||||
f 164 165 177
|
||||
f 165 178 177
|
||||
f 165 166 178
|
||||
f 166 179 178
|
||||
f 166 167 179
|
||||
f 167 180 179
|
||||
f 167 168 180
|
||||
f 168 169 180
|
||||
f 168 157 169
|
||||
f 169 182 181
|
||||
f 169 170 182
|
||||
f 170 183 182
|
||||
f 170 171 183
|
||||
f 171 184 183
|
||||
f 171 172 184
|
||||
f 172 185 184
|
||||
f 172 173 185
|
||||
f 173 186 185
|
||||
f 173 174 186
|
||||
f 174 187 186
|
||||
f 174 175 187
|
||||
f 175 188 187
|
||||
f 175 176 188
|
||||
f 176 189 188
|
||||
f 176 177 189
|
||||
f 177 190 189
|
||||
f 177 178 190
|
||||
f 178 191 190
|
||||
f 178 179 191
|
||||
f 179 192 191
|
||||
f 179 180 192
|
||||
f 180 181 192
|
||||
f 180 169 181
|
||||
f 181 194 193
|
||||
f 181 182 194
|
||||
f 182 195 194
|
||||
f 182 183 195
|
||||
f 183 196 195
|
||||
f 183 184 196
|
||||
f 184 197 196
|
||||
f 184 185 197
|
||||
f 185 198 197
|
||||
f 185 186 198
|
||||
f 186 199 198
|
||||
f 186 187 199
|
||||
f 187 200 199
|
||||
f 187 188 200
|
||||
f 188 201 200
|
||||
f 188 189 201
|
||||
f 189 202 201
|
||||
f 189 190 202
|
||||
f 190 203 202
|
||||
f 190 191 203
|
||||
f 191 204 203
|
||||
f 191 192 204
|
||||
f 192 193 204
|
||||
f 192 181 193
|
||||
f 193 206 205
|
||||
f 193 194 206
|
||||
f 194 207 206
|
||||
f 194 195 207
|
||||
f 195 208 207
|
||||
f 195 196 208
|
||||
f 196 209 208
|
||||
f 196 197 209
|
||||
f 197 210 209
|
||||
f 197 198 210
|
||||
f 198 211 210
|
||||
f 198 199 211
|
||||
f 199 212 211
|
||||
f 199 200 212
|
||||
f 200 213 212
|
||||
f 200 201 213
|
||||
f 201 214 213
|
||||
f 201 202 214
|
||||
f 202 215 214
|
||||
f 202 203 215
|
||||
f 203 216 215
|
||||
f 203 204 216
|
||||
f 204 205 216
|
||||
f 204 193 205
|
||||
f 205 218 217
|
||||
f 205 206 218
|
||||
f 206 219 218
|
||||
f 206 207 219
|
||||
f 207 220 219
|
||||
f 207 208 220
|
||||
f 208 221 220
|
||||
f 208 209 221
|
||||
f 209 222 221
|
||||
f 209 210 222
|
||||
f 210 223 222
|
||||
f 210 211 223
|
||||
f 211 224 223
|
||||
f 211 212 224
|
||||
f 212 225 224
|
||||
f 212 213 225
|
||||
f 213 226 225
|
||||
f 213 214 226
|
||||
f 214 227 226
|
||||
f 214 215 227
|
||||
f 215 228 227
|
||||
f 215 216 228
|
||||
f 216 217 228
|
||||
f 216 205 217
|
||||
f 217 230 229
|
||||
f 217 218 230
|
||||
f 218 231 230
|
||||
f 218 219 231
|
||||
f 219 232 231
|
||||
f 219 220 232
|
||||
f 220 233 232
|
||||
f 220 221 233
|
||||
f 221 234 233
|
||||
f 221 222 234
|
||||
f 222 235 234
|
||||
f 222 223 235
|
||||
f 223 236 235
|
||||
f 223 224 236
|
||||
f 224 237 236
|
||||
f 224 225 237
|
||||
f 225 238 237
|
||||
f 225 226 238
|
||||
f 226 239 238
|
||||
f 226 227 239
|
||||
f 227 240 239
|
||||
f 227 228 240
|
||||
f 228 229 240
|
||||
f 228 217 229
|
||||
f 229 242 241
|
||||
f 229 230 242
|
||||
f 230 243 242
|
||||
f 230 231 243
|
||||
f 231 244 243
|
||||
f 231 232 244
|
||||
f 232 245 244
|
||||
f 232 233 245
|
||||
f 233 246 245
|
||||
f 233 234 246
|
||||
f 234 247 246
|
||||
f 234 235 247
|
||||
f 235 248 247
|
||||
f 235 236 248
|
||||
f 236 249 248
|
||||
f 236 237 249
|
||||
f 237 250 249
|
||||
f 237 238 250
|
||||
f 238 251 250
|
||||
f 238 239 251
|
||||
f 239 252 251
|
||||
f 239 240 252
|
||||
f 240 241 252
|
||||
f 240 229 241
|
||||
f 241 254 253
|
||||
f 241 242 254
|
||||
f 242 255 254
|
||||
f 242 243 255
|
||||
f 243 256 255
|
||||
f 243 244 256
|
||||
f 244 257 256
|
||||
f 244 245 257
|
||||
f 245 258 257
|
||||
f 245 246 258
|
||||
f 246 259 258
|
||||
f 246 247 259
|
||||
f 247 260 259
|
||||
f 247 248 260
|
||||
f 248 261 260
|
||||
f 248 249 261
|
||||
f 249 262 261
|
||||
f 249 250 262
|
||||
f 250 263 262
|
||||
f 250 251 263
|
||||
f 251 264 263
|
||||
f 251 252 264
|
||||
f 252 253 264
|
||||
f 252 241 253
|
||||
f 253 266 265
|
||||
f 253 254 266
|
||||
f 254 267 266
|
||||
f 254 255 267
|
||||
f 255 268 267
|
||||
f 255 256 268
|
||||
f 256 269 268
|
||||
f 256 257 269
|
||||
f 257 270 269
|
||||
f 257 258 270
|
||||
f 258 271 270
|
||||
f 258 259 271
|
||||
f 259 272 271
|
||||
f 259 260 272
|
||||
f 260 273 272
|
||||
f 260 261 273
|
||||
f 261 274 273
|
||||
f 261 262 274
|
||||
f 262 275 274
|
||||
f 262 263 275
|
||||
f 263 276 275
|
||||
f 263 264 276
|
||||
f 264 265 276
|
||||
f 264 253 265
|
||||
f 265 278 277
|
||||
f 265 266 278
|
||||
f 266 279 278
|
||||
f 266 267 279
|
||||
f 267 280 279
|
||||
f 267 268 280
|
||||
f 268 281 280
|
||||
f 268 269 281
|
||||
f 269 282 281
|
||||
f 269 270 282
|
||||
f 270 283 282
|
||||
f 270 271 283
|
||||
f 271 284 283
|
||||
f 271 272 284
|
||||
f 272 285 284
|
||||
f 272 273 285
|
||||
f 273 286 285
|
||||
f 273 274 286
|
||||
f 274 287 286
|
||||
f 274 275 287
|
||||
f 275 288 287
|
||||
f 275 276 288
|
||||
f 276 277 288
|
||||
f 276 265 277
|
||||
f 277 2 1
|
||||
f 277 278 2
|
||||
f 278 3 2
|
||||
f 278 279 3
|
||||
f 279 4 3
|
||||
f 279 280 4
|
||||
f 280 5 4
|
||||
f 280 281 5
|
||||
f 281 6 5
|
||||
f 281 282 6
|
||||
f 282 7 6
|
||||
f 282 283 7
|
||||
f 283 8 7
|
||||
f 283 284 8
|
||||
f 284 9 8
|
||||
f 284 285 9
|
||||
f 285 10 9
|
||||
f 285 286 10
|
||||
f 286 11 10
|
||||
f 286 287 11
|
||||
f 287 12 11
|
||||
f 287 288 12
|
||||
f 288 1 12
|
||||
f 288 277 1
|
||||
# 576 faces
|
||||
|
||||
g
|
||||
BIN
第15章 真实光学环境的模拟/Sample15_7/bin/Sample15_7.apk
Normal file
BIN
第15章 真实光学环境的模拟/Sample15_7/bin/Sample15_7.apk
Normal file
Binary file not shown.
BIN
第15章 真实光学环境的模拟/Sample15_7/bin/classes.dex
Normal file
BIN
第15章 真实光学环境的模拟/Sample15_7/bin/classes.dex
Normal file
Binary file not shown.
BIN
第15章 真实光学环境的模拟/Sample15_7/bin/com/bn/Sample15_7/LoadUtil.class
Normal file
BIN
第15章 真实光学环境的模拟/Sample15_7/bin/com/bn/Sample15_7/LoadUtil.class
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
第15章 真实光学环境的模拟/Sample15_7/bin/com/bn/Sample15_7/Normal.class
Normal file
BIN
第15章 真实光学环境的模拟/Sample15_7/bin/com/bn/Sample15_7/Normal.class
Normal file
Binary file not shown.
BIN
第15章 真实光学环境的模拟/Sample15_7/bin/com/bn/Sample15_7/R$attr.class
Normal file
BIN
第15章 真实光学环境的模拟/Sample15_7/bin/com/bn/Sample15_7/R$attr.class
Normal file
Binary file not shown.
BIN
第15章 真实光学环境的模拟/Sample15_7/bin/com/bn/Sample15_7/R$drawable.class
Normal file
BIN
第15章 真实光学环境的模拟/Sample15_7/bin/com/bn/Sample15_7/R$drawable.class
Normal file
Binary file not shown.
BIN
第15章 真实光学环境的模拟/Sample15_7/bin/com/bn/Sample15_7/R$string.class
Normal file
BIN
第15章 真实光学环境的模拟/Sample15_7/bin/com/bn/Sample15_7/R$string.class
Normal file
Binary file not shown.
BIN
第15章 真实光学环境的模拟/Sample15_7/bin/com/bn/Sample15_7/R.class
Normal file
BIN
第15章 真实光学环境的模拟/Sample15_7/bin/com/bn/Sample15_7/R.class
Normal file
Binary file not shown.
Binary file not shown.
BIN
第15章 真实光学环境的模拟/Sample15_7/bin/com/bn/Sample15_7/ShaderUtil.class
Normal file
BIN
第15章 真实光学环境的模拟/Sample15_7/bin/com/bn/Sample15_7/ShaderUtil.class
Normal file
Binary file not shown.
BIN
第15章 真实光学环境的模拟/Sample15_7/bin/resources.ap_
Normal file
BIN
第15章 真实光学环境的模拟/Sample15_7/bin/resources.ap_
Normal file
Binary file not shown.
13
第15章 真实光学环境的模拟/Sample15_7/default.properties
Normal file
13
第15章 真实光学环境的模拟/Sample15_7/default.properties
Normal file
@@ -0,0 +1,13 @@
|
||||
# This file is automatically generated by Android Tools.
|
||||
# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
|
||||
#
|
||||
# This file must be checked in Version Control Systems.
|
||||
#
|
||||
# To customize properties used by the Ant build system use,
|
||||
# "build.properties", and override values to adapt the script to your
|
||||
# project structure.
|
||||
|
||||
# Indicates whether an apk should be generated for each density.
|
||||
split.density=false
|
||||
# Project target.
|
||||
target=android-8
|
||||
19
第15章 真实光学环境的模拟/Sample15_7/gen/com/bn/Sample15_7/R.java
Normal file
19
第15章 真实光学环境的模拟/Sample15_7/gen/com/bn/Sample15_7/R.java
Normal file
@@ -0,0 +1,19 @@
|
||||
/* AUTO-GENERATED FILE. DO NOT MODIFY.
|
||||
*
|
||||
* This class was automatically generated by the
|
||||
* aapt tool from the resource data it found. It
|
||||
* should not be modified by hand.
|
||||
*/
|
||||
|
||||
package com.bn.Sample15_7;
|
||||
|
||||
public final class R {
|
||||
public static final class attr {
|
||||
}
|
||||
public static final class drawable {
|
||||
public static final int icon=0x7f020000;
|
||||
}
|
||||
public static final class string {
|
||||
public static final int app_name=0x7f030000;
|
||||
}
|
||||
}
|
||||
BIN
第15章 真实光学环境的模拟/Sample15_7/res/drawable-hdpi/icon.png
Normal file
BIN
第15章 真实光学环境的模拟/Sample15_7/res/drawable-hdpi/icon.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 4.0 KiB |
BIN
第15章 真实光学环境的模拟/Sample15_7/res/drawable-ldpi/icon.png
Normal file
BIN
第15章 真实光学环境的模拟/Sample15_7/res/drawable-ldpi/icon.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.7 KiB |
BIN
第15章 真实光学环境的模拟/Sample15_7/res/drawable-mdpi/icon.png
Normal file
BIN
第15章 真实光学环境的模拟/Sample15_7/res/drawable-mdpi/icon.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 2.5 KiB |
4
第15章 真实光学环境的模拟/Sample15_7/res/values/strings.xml
Normal file
4
第15章 真实光学环境的模拟/Sample15_7/res/values/strings.xml
Normal file
@@ -0,0 +1,4 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="app_name">Sample15_7</string>
|
||||
</resources>
|
||||
297
第15章 真实光学环境的模拟/Sample15_7/src/com/bn/Sample15_7/LoadUtil.java
Normal file
297
第15章 真实光学环境的模拟/Sample15_7/src/com/bn/Sample15_7/LoadUtil.java
Normal file
@@ -0,0 +1,297 @@
|
||||
package com.bn.Sample15_7;
|
||||
import java.io.BufferedReader;
|
||||
import java.io.InputStream;
|
||||
import java.io.InputStreamReader;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import android.content.res.Resources;
|
||||
import android.util.Log;
|
||||
|
||||
public class LoadUtil
|
||||
{
|
||||
//求两个向量的叉积
|
||||
public static float[] getCrossProduct(float x1,float y1,float z1,float x2,float y2,float z2)
|
||||
{
|
||||
//求出两个矢量叉积矢量在XYZ轴的分量ABC
|
||||
float A=y1*z2-y2*z1;
|
||||
float B=z1*x2-z2*x1;
|
||||
float C=x1*y2-x2*y1;
|
||||
|
||||
return new float[]{A,B,C};
|
||||
}
|
||||
|
||||
//向量规格化
|
||||
public static float[] vectorNormal(float[] vector)
|
||||
{
|
||||
//求向量的模
|
||||
float module=(float)Math.sqrt(vector[0]*vector[0]+vector[1]*vector[1]+vector[2]*vector[2]);
|
||||
return new float[]{vector[0]/module,vector[1]/module,vector[2]/module};
|
||||
}
|
||||
|
||||
//从obj文件中加载携带顶点信息的物体,并自动计算每个顶点的平均法向量
|
||||
public static LoadedObjectVertexNormalAverage loadFromFileVertexOnlyAverage(String fname, Resources r,MySurfaceView mv)
|
||||
{
|
||||
//加载后物体的引用
|
||||
LoadedObjectVertexNormalAverage lo=null;
|
||||
//原始顶点坐标列表--直接从obj文件中加载
|
||||
ArrayList<Float> alv=new ArrayList<Float>();
|
||||
//顶点组装面索引列表--根据面的信息从文件中加载
|
||||
ArrayList<Integer> alFaceIndex=new ArrayList<Integer>();
|
||||
//结果顶点坐标列表--按面组织好
|
||||
ArrayList<Float> alvResult=new ArrayList<Float>();
|
||||
//平均前各个索引对应的点的法向量集合Map
|
||||
//此HashMap的key为点的索引, value为点所在的各个面的法向量的集合
|
||||
HashMap<Integer,HashSet<Normal>> hmn=new HashMap<Integer,HashSet<Normal>>();
|
||||
|
||||
try
|
||||
{
|
||||
InputStream in=r.getAssets().open(fname);
|
||||
InputStreamReader isr=new InputStreamReader(in);
|
||||
BufferedReader br=new BufferedReader(isr);
|
||||
String temps=null;
|
||||
|
||||
//扫面文件,根据行类型的不同执行不同的处理逻辑
|
||||
while((temps=br.readLine())!=null)
|
||||
{
|
||||
//用空格分割行中的各个组成部分
|
||||
String[] tempsa=temps.split("[ ]+");
|
||||
if(tempsa[0].trim().equals("v"))
|
||||
{//此行为顶点坐标
|
||||
//若为顶点坐标行则提取出此顶点的XYZ坐标添加到原始顶点坐标列表中
|
||||
alv.add(Float.parseFloat(tempsa[1]));
|
||||
alv.add(Float.parseFloat(tempsa[2]));
|
||||
alv.add(Float.parseFloat(tempsa[3]));
|
||||
}
|
||||
else if(tempsa[0].trim().equals("f"))
|
||||
{//此行为三角形面
|
||||
/*
|
||||
*若为三角形面行则根据 组成面的顶点的索引从原始顶点坐标列表中
|
||||
*提取相应的顶点坐标值添加到结果顶点坐标列表中,同时根据三个
|
||||
*顶点的坐标计算出此面的法向量并添加到平均前各个索引对应的点
|
||||
*的法向量集合组成的Map中
|
||||
*/
|
||||
|
||||
int[] index=new int[3];//三个顶点索引值的数组
|
||||
|
||||
//计算第0个顶点的索引,并获取此顶点的XYZ三个坐标
|
||||
index[0]=Integer.parseInt(tempsa[1].split("/")[0])-1;
|
||||
float x0=alv.get(3*index[0]);
|
||||
float y0=alv.get(3*index[0]+1);
|
||||
float z0=alv.get(3*index[0]+2);
|
||||
alvResult.add(x0);
|
||||
alvResult.add(y0);
|
||||
alvResult.add(z0);
|
||||
|
||||
//计算第1个顶点的索引,并获取此顶点的XYZ三个坐标
|
||||
index[1]=Integer.parseInt(tempsa[2].split("/")[0])-1;
|
||||
float x1=alv.get(3*index[1]);
|
||||
float y1=alv.get(3*index[1]+1);
|
||||
float z1=alv.get(3*index[1]+2);
|
||||
alvResult.add(x1);
|
||||
alvResult.add(y1);
|
||||
alvResult.add(z1);
|
||||
|
||||
//计算第2个顶点的索引,并获取此顶点的XYZ三个坐标
|
||||
index[2]=Integer.parseInt(tempsa[3].split("/")[0])-1;
|
||||
float x2=alv.get(3*index[2]);
|
||||
float y2=alv.get(3*index[2]+1);
|
||||
float z2=alv.get(3*index[2]+2);
|
||||
alvResult.add(x2);
|
||||
alvResult.add(y2);
|
||||
alvResult.add(z2);
|
||||
|
||||
//记录此面的顶点索引
|
||||
alFaceIndex.add(index[0]);
|
||||
alFaceIndex.add(index[1]);
|
||||
alFaceIndex.add(index[2]);
|
||||
|
||||
//通过三角形面两个边向量0-1,0-2求叉积得到此面的法向量
|
||||
//求0号点到1号点的向量
|
||||
float vxa=x1-x0;
|
||||
float vya=y1-y0;
|
||||
float vza=z1-z0;
|
||||
//求0号点到2号点的向量
|
||||
float vxb=x2-x0;
|
||||
float vyb=y2-y0;
|
||||
float vzb=z2-z0;
|
||||
//通过求两个向量的叉积计算法向量
|
||||
float[] vNormal=vectorNormal(getCrossProduct
|
||||
(
|
||||
vxa,vya,vza,vxb,vyb,vzb
|
||||
));
|
||||
|
||||
for(int tempInxex:index)
|
||||
{//记录每个索引点的法向量到平均前各个索引对应的点的法向量集合组成的Map中
|
||||
//获取当前索引对应点的法向量集合
|
||||
HashSet<Normal> hsn=hmn.get(tempInxex);
|
||||
if(hsn==null)
|
||||
{//若集合不存在则创建
|
||||
hsn=new HashSet<Normal>();
|
||||
}
|
||||
//将此点的法向量添加到集合中
|
||||
//由于Normal类重写了equals方法,因此同样的法向量不会重复出现在此点
|
||||
//对应的法向量集合中
|
||||
hsn.add(new Normal(vNormal[0],vNormal[1],vNormal[2]));
|
||||
//将集合放进HsahMap中
|
||||
hmn.put(tempInxex, hsn);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//生成顶点数组
|
||||
int size=alvResult.size();
|
||||
float[] vXYZ=new float[size];
|
||||
for(int i=0;i<size;i++)
|
||||
{
|
||||
vXYZ[i]=alvResult.get(i);
|
||||
}
|
||||
|
||||
//生成法向量数组
|
||||
float[] nXYZ=new float[alFaceIndex.size()*3];
|
||||
int c=0;
|
||||
for(Integer i:alFaceIndex)
|
||||
{
|
||||
//根据当前点的索引从Map中取出一个法向量的集合
|
||||
HashSet<Normal> hsn=hmn.get(i);
|
||||
//求出平均法向量
|
||||
float[] tn=Normal.getAverage(hsn);
|
||||
//将计算出的平均法向量存放到法向量数组中
|
||||
nXYZ[c++]=tn[0];
|
||||
nXYZ[c++]=tn[1];
|
||||
nXYZ[c++]=tn[2];
|
||||
}
|
||||
//创建3D物体对象
|
||||
lo=new LoadedObjectVertexNormalAverage(mv,vXYZ,nXYZ);
|
||||
}
|
||||
catch(Exception e)
|
||||
{
|
||||
Log.d("load error", "load error");
|
||||
e.printStackTrace();
|
||||
}
|
||||
return lo;
|
||||
}
|
||||
//从obj文件中加载仅携带顶点信息的物体
|
||||
//首先加载顶点信息,再根据顶点组成三角形面的情况自动计算出每个面的法向量
|
||||
//然后将这个面的法向量分配给这个面上的顶点
|
||||
public static LoadedObjectVertexNormalFace loadFromFileVertexOnlyFace(String fname, Resources r,MySurfaceView mv)
|
||||
{
|
||||
//加载后3D对象的引用
|
||||
LoadedObjectVertexNormalFace lo=null;
|
||||
//原始顶点坐标列表--按顺序从obj文件中加载的
|
||||
ArrayList<Float> alv=new ArrayList<Float>();
|
||||
//结果顶点坐标列表 --根据组成面的情况组织好的
|
||||
ArrayList<Float> alvResult=new ArrayList<Float>();
|
||||
//结果法向量列表--根据组成面的情况组织好的
|
||||
ArrayList<Float> alnResult=new ArrayList<Float>();
|
||||
|
||||
try
|
||||
{
|
||||
InputStream in=r.getAssets().open(fname);
|
||||
InputStreamReader isr=new InputStreamReader(in);
|
||||
BufferedReader br=new BufferedReader(isr);
|
||||
String temps=null;
|
||||
|
||||
//循环不断从文件中读取行,根据行类型的不同执行
|
||||
//不同的处理逻辑
|
||||
while((temps=br.readLine())!=null)
|
||||
{
|
||||
String[] tempsa=temps.split("[ ]+");
|
||||
if(tempsa[0].trim().equals("v"))
|
||||
{//此行为顶点坐标
|
||||
//若为顶点坐标行则提取出此顶点的XYZ坐标添加到原始顶点坐标列表中
|
||||
alv.add(Float.parseFloat(tempsa[1]));
|
||||
alv.add(Float.parseFloat(tempsa[2]));
|
||||
alv.add(Float.parseFloat(tempsa[3]));
|
||||
}
|
||||
else if(tempsa[0].trim().equals("f"))
|
||||
{//此行为三角形面
|
||||
/*
|
||||
*若为三角形面行则根据 组成面的顶点的索引从原始顶点坐标列表中
|
||||
*提取相应的顶点坐标值添加到结果顶点坐标列表中,同时根据三个
|
||||
*顶点的坐标计算出法向量并添加到结果法向量列表中
|
||||
*/
|
||||
|
||||
//提取三角形第一个顶点的坐标
|
||||
int index=Integer.parseInt(tempsa[1].split("/")[0])-1;
|
||||
float x0=alv.get(3*index);
|
||||
float y0=alv.get(3*index+1);
|
||||
float z0=alv.get(3*index+2);
|
||||
alvResult.add(x0);
|
||||
alvResult.add(y0);
|
||||
alvResult.add(z0);
|
||||
|
||||
//提取三角形第二个顶点的坐标
|
||||
index=Integer.parseInt(tempsa[2].split("/")[0])-1;
|
||||
float x1=alv.get(3*index);
|
||||
float y1=alv.get(3*index+1);
|
||||
float z1=alv.get(3*index+2);
|
||||
alvResult.add(x1);
|
||||
alvResult.add(y1);
|
||||
alvResult.add(z1);
|
||||
|
||||
//提取三角形第三个顶点的坐标
|
||||
index=Integer.parseInt(tempsa[3].split("/")[0])-1;
|
||||
float x2=alv.get(3*index);
|
||||
float y2=alv.get(3*index+1);
|
||||
float z2=alv.get(3*index+2);
|
||||
alvResult.add(x2);
|
||||
alvResult.add(y2);
|
||||
alvResult.add(z2);
|
||||
|
||||
//通过三角形面两个边向量0-1,0-2求叉积得到此面的法向量
|
||||
//求0号点到1号点的向量
|
||||
float vxa=x1-x0;
|
||||
float vya=y1-y0;
|
||||
float vza=z1-z0;
|
||||
//求0号点到2号点的向量
|
||||
float vxb=x2-x0;
|
||||
float vyb=y2-y0;
|
||||
float vzb=z2-z0;
|
||||
|
||||
//通过球两个向量的叉积计算法向量
|
||||
float[] vNormal=vectorNormal
|
||||
(
|
||||
getCrossProduct
|
||||
(
|
||||
vxa,vya,vza,vxb,vyb,vzb
|
||||
)
|
||||
);
|
||||
//将计算出的法向量添加到结果法向量列表中
|
||||
for(int i=0;i<3;i++)
|
||||
{
|
||||
alnResult.add(vNormal[0]);
|
||||
alnResult.add(vNormal[1]);
|
||||
alnResult.add(vNormal[2]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//obj文件读取结束后生成顶点数组及生成法向量数组
|
||||
//生成顶点数组
|
||||
int size=alvResult.size();
|
||||
float[] vXYZ=new float[size];
|
||||
for(int i=0;i<size;i++)
|
||||
{
|
||||
vXYZ[i]=alvResult.get(i);
|
||||
}
|
||||
|
||||
//生成法向量数组
|
||||
size=alnResult.size();
|
||||
float[] nXYZ=new float[size];
|
||||
for(int i=0;i<size;i++)
|
||||
{
|
||||
nXYZ[i]=alnResult.get(i);
|
||||
}
|
||||
|
||||
//创建3D对象
|
||||
lo=new LoadedObjectVertexNormalFace(mv,vXYZ,nXYZ);
|
||||
}
|
||||
catch(Exception e)
|
||||
{
|
||||
Log.d("load error", "load error");
|
||||
e.printStackTrace();
|
||||
}
|
||||
return lo;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,132 @@
|
||||
package com.bn.Sample15_7;
|
||||
import java.nio.ByteBuffer;
|
||||
import java.nio.ByteOrder;
|
||||
import java.nio.FloatBuffer;
|
||||
import android.opengl.GLES20;
|
||||
|
||||
//加载后的物体——携带顶点信息,自动计算面平均法向量
|
||||
public class LoadedObjectVertexNormalAverage
|
||||
{
|
||||
int mProgram;//自定义渲染管线着色器程序id
|
||||
int muMVPMatrixHandle;//总变换矩阵引用
|
||||
int muMMatrixHandle;//位置、旋转变换矩阵
|
||||
int maPositionHandle; //顶点位置属性引用
|
||||
int maNormalHandle; //顶点法向量属性引用
|
||||
int maLightLocationHandle;//光源位置属性引用
|
||||
int maCameraHandle; //摄像机位置属性引用
|
||||
int muIsShadow;//是否绘制阴影属性引用
|
||||
int muProjCameraMatrixHandle;//投影、摄像机组合矩阵引用
|
||||
|
||||
String mVertexShader;//顶点着色器代码脚本
|
||||
String mFragmentShader;//片元着色器代码脚本
|
||||
|
||||
FloatBuffer mVertexBuffer;//顶点坐标数据缓冲
|
||||
FloatBuffer mNormalBuffer;//顶点法向量数据缓冲
|
||||
int vCount=0;
|
||||
|
||||
public LoadedObjectVertexNormalAverage(MySurfaceView mv,float[] vertices,float[] normals)
|
||||
{
|
||||
//初始化顶点坐标与着色数据
|
||||
initVertexData(vertices,normals);
|
||||
//初始化shader
|
||||
initShader(mv);
|
||||
}
|
||||
|
||||
//初始化顶点坐标与着色数据的方法
|
||||
public void initVertexData(float[] vertices,float[] normals)
|
||||
{
|
||||
//顶点坐标数据的初始化================begin============================
|
||||
vCount=vertices.length/3;
|
||||
|
||||
//创建顶点坐标数据缓冲
|
||||
//vertices.length*4是因为一个整数四个字节
|
||||
ByteBuffer vbb = ByteBuffer.allocateDirect(vertices.length*4);
|
||||
vbb.order(ByteOrder.nativeOrder());//设置字节顺序
|
||||
mVertexBuffer = vbb.asFloatBuffer();//转换为Float型缓冲
|
||||
mVertexBuffer.put(vertices);//向缓冲区中放入顶点坐标数据
|
||||
mVertexBuffer.position(0);//设置缓冲区起始位置
|
||||
//特别提示:由于不同平台字节顺序不同数据单元不是字节的一定要经过ByteBuffer
|
||||
//转换,关键是要通过ByteOrder设置nativeOrder(),否则有可能会出问题
|
||||
//顶点坐标数据的初始化================end============================
|
||||
|
||||
//顶点法向量数据的初始化================begin============================
|
||||
ByteBuffer cbb = ByteBuffer.allocateDirect(normals.length*4);
|
||||
cbb.order(ByteOrder.nativeOrder());//设置字节顺序
|
||||
mNormalBuffer = cbb.asFloatBuffer();//转换为Float型缓冲
|
||||
mNormalBuffer.put(normals);//向缓冲区中放入顶点法向量数据
|
||||
mNormalBuffer.position(0);//设置缓冲区起始位置
|
||||
//特别提示:由于不同平台字节顺序不同数据单元不是字节的一定要经过ByteBuffer
|
||||
//转换,关键是要通过ByteOrder设置nativeOrder(),否则有可能会出问题
|
||||
//顶点着色数据的初始化================end============================
|
||||
}
|
||||
|
||||
//初始化shader
|
||||
public void initShader(MySurfaceView mv)
|
||||
{
|
||||
//加载顶点着色器的脚本内容
|
||||
mVertexShader=ShaderUtil.loadFromAssetsFile("vertex_shadow.sh", mv.getResources());
|
||||
//加载片元着色器的脚本内容
|
||||
mFragmentShader=ShaderUtil.loadFromAssetsFile("frag_shadow.sh", mv.getResources());
|
||||
//基于顶点着色器与片元着色器创建程序
|
||||
mProgram = ShaderUtil.createProgram(mVertexShader, mFragmentShader);
|
||||
//获取程序中顶点位置属性引用
|
||||
maPositionHandle = GLES20.glGetAttribLocation(mProgram, "aPosition");
|
||||
//获取程序中顶点颜色属性引用
|
||||
maNormalHandle= GLES20.glGetAttribLocation(mProgram, "aNormal");
|
||||
//获取程序中总变换矩阵引用
|
||||
muMVPMatrixHandle = GLES20.glGetUniformLocation(mProgram, "uMVPMatrix");
|
||||
//获取位置、旋转变换矩阵引用
|
||||
muMMatrixHandle = GLES20.glGetUniformLocation(mProgram, "uMMatrix");
|
||||
//获取程序中光源位置引用
|
||||
maLightLocationHandle=GLES20.glGetUniformLocation(mProgram, "uLightLocation");
|
||||
//获取程序中摄像机位置引用
|
||||
maCameraHandle=GLES20.glGetUniformLocation(mProgram, "uCamera");
|
||||
//获取程序中是否绘制阴影属性引用
|
||||
muIsShadow=GLES20.glGetUniformLocation(mProgram, "isShadow");
|
||||
//获取程序中投影、摄像机组合矩阵引用
|
||||
muProjCameraMatrixHandle=GLES20.glGetUniformLocation(mProgram, "uMProjCameraMatrix");
|
||||
}
|
||||
|
||||
public void drawSelf(int isShadow)
|
||||
{
|
||||
//制定使用某套着色器程序
|
||||
GLES20.glUseProgram(mProgram);
|
||||
//将最终变换矩阵传入着色器程序
|
||||
GLES20.glUniformMatrix4fv(muMVPMatrixHandle, 1, false, MatrixState.getFinalMatrix(), 0);
|
||||
//将位置、旋转变换矩阵传入着色器程序
|
||||
GLES20.glUniformMatrix4fv(muMMatrixHandle, 1, false, MatrixState.getMMatrix(), 0);
|
||||
//将光源位置传入着色器程序
|
||||
GLES20.glUniform3fv(maLightLocationHandle, 1, MatrixState.lightPositionFB);
|
||||
//将摄像机位置传入着色器程序
|
||||
GLES20.glUniform3fv(maCameraHandle, 1, MatrixState.cameraFB);
|
||||
//将是否绘制阴影属性传入着色器程序
|
||||
GLES20.glUniform1i(muIsShadow, isShadow);
|
||||
//将投影、摄像机组合矩阵传入着色器程序
|
||||
GLES20.glUniformMatrix4fv(muProjCameraMatrixHandle, 1, false, MatrixState.getViewProjMatrix(), 0);
|
||||
//将顶点位置数据传入渲染管线
|
||||
GLES20.glVertexAttribPointer
|
||||
(
|
||||
maPositionHandle,
|
||||
3,
|
||||
GLES20.GL_FLOAT,
|
||||
false,
|
||||
3*4,
|
||||
mVertexBuffer
|
||||
);
|
||||
//将顶点法向量数据传入渲染管线
|
||||
GLES20.glVertexAttribPointer
|
||||
(
|
||||
maNormalHandle,
|
||||
3,
|
||||
GLES20.GL_FLOAT,
|
||||
false,
|
||||
3*4,
|
||||
mNormalBuffer
|
||||
);
|
||||
//启用顶点位置、法向量数据
|
||||
GLES20.glEnableVertexAttribArray(maPositionHandle);
|
||||
GLES20.glEnableVertexAttribArray(maNormalHandle);
|
||||
//绘制加载的物体
|
||||
GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, vCount);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,133 @@
|
||||
package com.bn.Sample15_7;
|
||||
import java.nio.ByteBuffer;
|
||||
import java.nio.ByteOrder;
|
||||
import java.nio.FloatBuffer;
|
||||
import android.opengl.GLES20;
|
||||
|
||||
//加载后的物体——携带顶点信息,自动计算面法向量
|
||||
public class LoadedObjectVertexNormalFace
|
||||
{
|
||||
int mProgram;//自定义渲染管线着色器程序id
|
||||
int muMVPMatrixHandle;//总变换矩阵引用
|
||||
int muMMatrixHandle;//位置、旋转变换矩阵
|
||||
int maPositionHandle; //顶点位置属性引用
|
||||
int maNormalHandle; //顶点法向量属性引用
|
||||
int maLightLocationHandle;//光源位置属性引用
|
||||
int maCameraHandle; //摄像机位置属性引用
|
||||
int muIsShadow;//是否绘制阴影属性引用
|
||||
int muProjCameraMatrixHandle;//投影矩阵引用
|
||||
|
||||
String mVertexShader;//顶点着色器代码脚本
|
||||
String mFragmentShader;//片元着色器代码脚本
|
||||
|
||||
FloatBuffer mVertexBuffer;//顶点坐标数据缓冲
|
||||
FloatBuffer mNormalBuffer;//顶点法向量数据缓冲
|
||||
int vCount=0;
|
||||
|
||||
public LoadedObjectVertexNormalFace(MySurfaceView mv,float[] vertices,float[] normals)
|
||||
{
|
||||
//初始化顶点坐标与着色数据
|
||||
initVertexData(vertices,normals);
|
||||
//初始化shader
|
||||
initShader(mv);
|
||||
}
|
||||
|
||||
//初始化顶点坐标与着色数据的方法
|
||||
public void initVertexData(float[] vertices,float[] normals)
|
||||
{
|
||||
//顶点坐标数据的初始化================begin============================
|
||||
vCount=vertices.length/3;
|
||||
|
||||
//创建顶点坐标数据缓冲
|
||||
//vertices.length*4是因为一个整数四个字节
|
||||
ByteBuffer vbb = ByteBuffer.allocateDirect(vertices.length*4);
|
||||
vbb.order(ByteOrder.nativeOrder());//设置字节顺序
|
||||
mVertexBuffer = vbb.asFloatBuffer();//转换为Float型缓冲
|
||||
mVertexBuffer.put(vertices);//向缓冲区中放入顶点坐标数据
|
||||
mVertexBuffer.position(0);//设置缓冲区起始位置
|
||||
//特别提示:由于不同平台字节顺序不同数据单元不是字节的一定要经过ByteBuffer
|
||||
//转换,关键是要通过ByteOrder设置nativeOrder(),否则有可能会出问题
|
||||
//顶点坐标数据的初始化================end============================
|
||||
|
||||
//顶点法向量数据的初始化================begin============================
|
||||
ByteBuffer cbb = ByteBuffer.allocateDirect(normals.length*4);
|
||||
cbb.order(ByteOrder.nativeOrder());//设置字节顺序
|
||||
mNormalBuffer = cbb.asFloatBuffer();//转换为Float型缓冲
|
||||
mNormalBuffer.put(normals);//向缓冲区中放入顶点法向量数据
|
||||
mNormalBuffer.position(0);//设置缓冲区起始位置
|
||||
//特别提示:由于不同平台字节顺序不同数据单元不是字节的一定要经过ByteBuffer
|
||||
//转换,关键是要通过ByteOrder设置nativeOrder(),否则有可能会出问题
|
||||
//顶点着色数据的初始化================end============================
|
||||
}
|
||||
|
||||
//初始化shader
|
||||
public void initShader(MySurfaceView mv)
|
||||
{
|
||||
//加载顶点着色器的脚本内容
|
||||
mVertexShader=ShaderUtil.loadFromAssetsFile("vertex_shadow.sh", mv.getResources());
|
||||
//加载片元着色器的脚本内容
|
||||
mFragmentShader=ShaderUtil.loadFromAssetsFile("frag_shadow.sh", mv.getResources());
|
||||
//基于顶点着色器与片元着色器创建程序
|
||||
mProgram = ShaderUtil.createProgram(mVertexShader, mFragmentShader);
|
||||
//获取程序中顶点位置属性引用
|
||||
maPositionHandle = GLES20.glGetAttribLocation(mProgram, "aPosition");
|
||||
//获取程序中顶点颜色属性引用
|
||||
maNormalHandle= GLES20.glGetAttribLocation(mProgram, "aNormal");
|
||||
//获取程序中总变换矩阵引用
|
||||
muMVPMatrixHandle = GLES20.glGetUniformLocation(mProgram, "uMVPMatrix");
|
||||
//获取位置、旋转变换矩阵引用
|
||||
muMMatrixHandle = GLES20.glGetUniformLocation(mProgram, "uMMatrix");
|
||||
//获取程序中光源位置引用
|
||||
maLightLocationHandle=GLES20.glGetUniformLocation(mProgram, "uLightLocation");
|
||||
//获取程序中摄像机位置引用
|
||||
maCameraHandle=GLES20.glGetUniformLocation(mProgram, "uCamera");
|
||||
//获取程序中是否绘制阴影属性引用
|
||||
muIsShadow=GLES20.glGetUniformLocation(mProgram, "isShadow");
|
||||
//获取程序中投影、摄像机组合矩阵引用
|
||||
muProjCameraMatrixHandle=GLES20.glGetUniformLocation(mProgram, "uMProjCameraMatrix");
|
||||
}
|
||||
|
||||
public void drawSelf(int isShadow)
|
||||
{
|
||||
//制定使用某套着色器程序
|
||||
GLES20.glUseProgram(mProgram);
|
||||
//将最终变换矩阵传入着色器程序
|
||||
GLES20.glUniformMatrix4fv(muMVPMatrixHandle, 1, false, MatrixState.getFinalMatrix(), 0);
|
||||
//将位置、旋转变换矩阵传入着色器程序
|
||||
GLES20.glUniformMatrix4fv(muMMatrixHandle, 1, false, MatrixState.getMMatrix(), 0);
|
||||
//将光源位置传入着色器程序
|
||||
GLES20.glUniform3fv(maLightLocationHandle, 1, MatrixState.lightPositionFB);
|
||||
//将摄像机位置传入着色器程序
|
||||
GLES20.glUniform3fv(maCameraHandle, 1, MatrixState.cameraFB);
|
||||
//将是否绘制阴影属性传入着色器程序
|
||||
GLES20.glUniform1i(muIsShadow, isShadow);
|
||||
//将投影、摄像机组合矩阵传入着色器程序
|
||||
GLES20.glUniformMatrix4fv(muProjCameraMatrixHandle, 1, false, MatrixState.getViewProjMatrix(), 0);
|
||||
|
||||
//将顶点位置数据传入渲染管线
|
||||
GLES20.glVertexAttribPointer
|
||||
(
|
||||
maPositionHandle,
|
||||
3,
|
||||
GLES20.GL_FLOAT,
|
||||
false,
|
||||
3*4,
|
||||
mVertexBuffer
|
||||
);
|
||||
//将顶点法向量数据传入渲染管线
|
||||
GLES20.glVertexAttribPointer
|
||||
(
|
||||
maNormalHandle,
|
||||
3,
|
||||
GLES20.GL_FLOAT,
|
||||
false,
|
||||
3*4,
|
||||
mNormalBuffer
|
||||
);
|
||||
//启用顶点位置、法向量数据
|
||||
GLES20.glEnableVertexAttribArray(maPositionHandle);
|
||||
GLES20.glEnableVertexAttribArray(maNormalHandle);
|
||||
//绘制被加载的物体
|
||||
GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, vCount);
|
||||
}
|
||||
}
|
||||
156
第15章 真实光学环境的模拟/Sample15_7/src/com/bn/Sample15_7/MatrixState.java
Normal file
156
第15章 真实光学环境的模拟/Sample15_7/src/com/bn/Sample15_7/MatrixState.java
Normal file
@@ -0,0 +1,156 @@
|
||||
package com.bn.Sample15_7;
|
||||
|
||||
import java.nio.ByteBuffer;
|
||||
import java.nio.ByteOrder;
|
||||
import java.nio.FloatBuffer;
|
||||
import java.util.*;
|
||||
import android.opengl.Matrix;
|
||||
|
||||
//存储系统矩阵状态的类
|
||||
public class MatrixState
|
||||
{
|
||||
private static float[] mProjMatrix = new float[16];//4x4矩阵 投影用
|
||||
private static float[] mVMatrix = new float[16];//摄像机位置朝向9参数矩阵
|
||||
private static float[] currMatrix;//当前变换矩阵
|
||||
public static float[] lightLocation=new float[]{0,0,0};//定位光光源位置
|
||||
public static FloatBuffer cameraFB;
|
||||
public static FloatBuffer lightPositionFB;
|
||||
|
||||
public static Stack<float[]> mStack=new Stack<float[]>();//保护变换矩阵的栈
|
||||
|
||||
public static void setInitStack()//获取不变换初始矩阵
|
||||
{
|
||||
currMatrix=new float[16];
|
||||
Matrix.setRotateM(currMatrix, 0, 0, 1, 0, 0);
|
||||
}
|
||||
|
||||
public static void pushMatrix()//保护变换矩阵
|
||||
{
|
||||
mStack.push(currMatrix.clone());
|
||||
}
|
||||
|
||||
public static void popMatrix()//恢复变换矩阵
|
||||
{
|
||||
currMatrix=mStack.pop();
|
||||
}
|
||||
|
||||
public static void translate(float x,float y,float z)//设置沿xyz轴移动
|
||||
{
|
||||
Matrix.translateM(currMatrix, 0, x, y, z);
|
||||
}
|
||||
|
||||
public static void rotate(float angle,float x,float y,float z)//设置绕xyz轴移动
|
||||
{
|
||||
Matrix.rotateM(currMatrix,0,angle,x,y,z);
|
||||
}
|
||||
|
||||
public static void scale(float x,float y,float z)
|
||||
{
|
||||
Matrix.scaleM(currMatrix,0, x, y, z);
|
||||
}
|
||||
|
||||
|
||||
//设置摄像机
|
||||
public static void setCamera
|
||||
(
|
||||
float cx, //摄像机位置x
|
||||
float cy, //摄像机位置y
|
||||
float cz, //摄像机位置z
|
||||
float tx, //摄像机目标点x
|
||||
float ty, //摄像机目标点y
|
||||
float tz, //摄像机目标点z
|
||||
float upx, //摄像机UP向量X分量
|
||||
float upy, //摄像机UP向量Y分量
|
||||
float upz //摄像机UP向量Z分量
|
||||
)
|
||||
{
|
||||
Matrix.setLookAtM
|
||||
(
|
||||
mVMatrix,
|
||||
0,
|
||||
cx,
|
||||
cy,
|
||||
cz,
|
||||
tx,
|
||||
ty,
|
||||
tz,
|
||||
upx,
|
||||
upy,
|
||||
upz
|
||||
);
|
||||
|
||||
float[] cameraLocation=new float[3];//摄像机位置
|
||||
cameraLocation[0]=cx;
|
||||
cameraLocation[1]=cy;
|
||||
cameraLocation[2]=cz;
|
||||
|
||||
ByteBuffer llbb = ByteBuffer.allocateDirect(3*4);
|
||||
llbb.order(ByteOrder.nativeOrder());//设置字节顺序
|
||||
cameraFB=llbb.asFloatBuffer();
|
||||
cameraFB.put(cameraLocation);
|
||||
cameraFB.position(0);
|
||||
}
|
||||
|
||||
//设置透视投影参数
|
||||
public static void setProjectFrustum
|
||||
(
|
||||
float left, //near面的left
|
||||
float right, //near面的right
|
||||
float bottom, //near面的bottom
|
||||
float top, //near面的top
|
||||
float near, //near面距离
|
||||
float far //far面距离
|
||||
)
|
||||
{
|
||||
Matrix.frustumM(mProjMatrix, 0, left, right, bottom, top, near, far);
|
||||
}
|
||||
|
||||
//设置正交投影参数
|
||||
public static void setProjectOrtho
|
||||
(
|
||||
float left, //near面的left
|
||||
float right, //near面的right
|
||||
float bottom, //near面的bottom
|
||||
float top, //near面的top
|
||||
float near, //near面距离
|
||||
float far //far面距离
|
||||
)
|
||||
{
|
||||
Matrix.orthoM(mProjMatrix, 0, left, right, bottom, top, near, far);
|
||||
}
|
||||
|
||||
//获取具体物体的总变换矩阵
|
||||
public static float[] getFinalMatrix()
|
||||
{
|
||||
float[] mMVPMatrix=new float[16];
|
||||
Matrix.multiplyMM(mMVPMatrix, 0, mVMatrix, 0, currMatrix, 0);
|
||||
Matrix.multiplyMM(mMVPMatrix, 0, mProjMatrix, 0, mMVPMatrix, 0);
|
||||
return mMVPMatrix;
|
||||
}
|
||||
|
||||
//获取具体物体的变换矩阵
|
||||
public static float[] getMMatrix()
|
||||
{
|
||||
return currMatrix;
|
||||
}
|
||||
|
||||
//设置灯光位置的方法
|
||||
public static void setLightLocation(float x,float y,float z)
|
||||
{
|
||||
lightLocation[0]=x;
|
||||
lightLocation[1]=y;
|
||||
lightLocation[2]=z;
|
||||
ByteBuffer llbb = ByteBuffer.allocateDirect(3*4);
|
||||
llbb.order(ByteOrder.nativeOrder());//设置字节顺序
|
||||
lightPositionFB=llbb.asFloatBuffer();
|
||||
lightPositionFB.put(lightLocation);
|
||||
lightPositionFB.position(0);
|
||||
}
|
||||
|
||||
public static float[] getViewProjMatrix()
|
||||
{
|
||||
float[] mMVPMatrix=new float[16];
|
||||
Matrix.multiplyMM(mMVPMatrix, 0, mProjMatrix, 0, mVMatrix, 0);
|
||||
return mMVPMatrix;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,193 @@
|
||||
package com.bn.Sample15_7;
|
||||
import android.opengl.GLSurfaceView;
|
||||
import android.opengl.GLES20;
|
||||
import android.view.MotionEvent;
|
||||
import javax.microedition.khronos.egl.EGLConfig;
|
||||
import javax.microedition.khronos.opengles.GL10;
|
||||
import android.content.Context;
|
||||
|
||||
class MySurfaceView extends GLSurfaceView
|
||||
{
|
||||
private final float TOUCH_SCALE_FACTOR = 180.0f/320;//角度缩放比例
|
||||
private SceneRenderer mRenderer;//场景渲染器
|
||||
|
||||
private float mPreviousY;//上次的触控位置Y坐标
|
||||
private float mPreviousX;//上次的触控位置X坐标
|
||||
//关于摄像机的变量
|
||||
float cx=0;//摄像机x位置
|
||||
float cy=0;//摄像机y位置
|
||||
float cz=60;//摄像机z位置
|
||||
|
||||
float tx=0;//目标点x位置
|
||||
float ty=0;//目标点y位置
|
||||
float tz=0;//目标点z位置
|
||||
public float currSightDis=60;//摄像机和目标的距离
|
||||
float angdegElevation=30;//仰角
|
||||
public float angdegAzimuth=180;//方位角
|
||||
|
||||
//关于灯光的变量
|
||||
float lx=0;//x位置
|
||||
float ly=0;//y位置
|
||||
float lz=0;//z位置
|
||||
float lightDis=100;
|
||||
float lightElevation=40;//灯光仰角
|
||||
public float lightAzimuth=180;//灯光的方位角
|
||||
public MySurfaceView(Context context) {
|
||||
super(context);
|
||||
this.setEGLContextClientVersion(2); //设置使用OPENGL ES2.0
|
||||
mRenderer = new SceneRenderer(); //创建场景渲染器
|
||||
setRenderer(mRenderer); //设置渲染器
|
||||
setRenderMode(GLSurfaceView.RENDERMODE_CONTINUOUSLY);//设置渲染模式为主动渲染
|
||||
}
|
||||
|
||||
//触摸事件回调方法
|
||||
@Override
|
||||
public boolean onTouchEvent(MotionEvent e)
|
||||
{
|
||||
float y = e.getY();
|
||||
float x = e.getX();
|
||||
switch (e.getAction()) {
|
||||
case MotionEvent.ACTION_MOVE:
|
||||
float dy = y - mPreviousY;//计算触控笔Y位移
|
||||
float dx = x - mPreviousX;//计算触控笔X位移
|
||||
angdegAzimuth += dx * TOUCH_SCALE_FACTOR;//设置沿x轴旋转角度
|
||||
angdegElevation += dy * TOUCH_SCALE_FACTOR;//设置沿z轴旋转角度
|
||||
//将仰角限制在5~90度范围内
|
||||
angdegElevation = Math.max(angdegElevation, 5);
|
||||
angdegElevation = Math.min(angdegElevation, 90);
|
||||
//设置摄像机的位置
|
||||
setCameraPostion();
|
||||
}
|
||||
mPreviousY = y;//记录触控笔位置
|
||||
mPreviousX = x;//记录触控笔位置
|
||||
return true;
|
||||
}
|
||||
// 设置摄像机位置的方法
|
||||
public void setCameraPostion() {
|
||||
//计算摄像机的位置
|
||||
double angradElevation = Math.toRadians(angdegElevation);// 仰角(弧度)
|
||||
double angradAzimuth = Math.toRadians(angdegAzimuth);// 方位角
|
||||
cx = (float) (tx - currSightDis * Math.cos(angradElevation) * Math.sin(angradAzimuth));
|
||||
cy = (float) (ty + currSightDis * Math.sin(angradElevation));
|
||||
cz = (float) (tz - currSightDis * Math.cos(angradElevation) * Math.cos(angradAzimuth));
|
||||
}
|
||||
// 位置灯光位置的方法
|
||||
public void setLightPostion() {
|
||||
//计算灯光的位置
|
||||
double angradElevation = Math.toRadians(lightElevation);// 仰角(弧度)
|
||||
double angradAzimuth = Math.toRadians(lightAzimuth);// 方位角
|
||||
lx = (float) (- lightDis * Math.cos(angradElevation) * Math.sin(angradAzimuth));
|
||||
ly = (float) (+ lightDis * Math.sin(angradElevation));
|
||||
lz = (float) (- lightDis * Math.cos(angradElevation) * Math.cos(angradAzimuth));
|
||||
}
|
||||
private class SceneRenderer implements GLSurfaceView.Renderer
|
||||
{
|
||||
//从指定的obj文件中加载对象
|
||||
LoadedObjectVertexNormalFace pm;
|
||||
LoadedObjectVertexNormalFace cft;
|
||||
LoadedObjectVertexNormalAverage qt;
|
||||
LoadedObjectVertexNormalAverage yh;
|
||||
LoadedObjectVertexNormalAverage ch;
|
||||
|
||||
public void onDrawFrame(GL10 gl)
|
||||
{
|
||||
//清除深度缓冲与颜色缓冲
|
||||
GLES20.glClear( GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);
|
||||
//设置camera位置
|
||||
MatrixState.setCamera
|
||||
(
|
||||
cx, //人眼位置的X
|
||||
cy, //人眼位置的Y
|
||||
cz, //人眼位置的Z
|
||||
tx, //人眼球看的点X
|
||||
ty, //人眼球看的点Y
|
||||
tz, //人眼球看的点Z
|
||||
0, //up位置
|
||||
1,
|
||||
0
|
||||
);
|
||||
//初始化光源位置
|
||||
MatrixState.setLightLocation(lx, ly, lz);
|
||||
//若加载的物体部位空则绘制物体
|
||||
pm.drawSelf(0);//平面
|
||||
drawObject(1);
|
||||
|
||||
drawObject(0);
|
||||
|
||||
}
|
||||
|
||||
public void drawObject(int situ)
|
||||
{
|
||||
//绘制长方体
|
||||
MatrixState.pushMatrix();
|
||||
MatrixState.scale(1.5f, 1.5f, 1.5f);
|
||||
MatrixState.translate(-10f, 0f, 0);
|
||||
cft.drawSelf(situ);
|
||||
MatrixState.popMatrix();
|
||||
//绘制球体
|
||||
MatrixState.pushMatrix();
|
||||
MatrixState.scale(1.5f, 1.5f, 1.5f);
|
||||
MatrixState.translate(10f, 0f, 0);
|
||||
qt.drawSelf(situ);
|
||||
MatrixState.popMatrix();
|
||||
//绘制圆环
|
||||
MatrixState.pushMatrix();
|
||||
MatrixState.scale(1.5f, 1.5f, 1.5f);
|
||||
MatrixState.translate(0, 0, -10f);
|
||||
yh.drawSelf(situ);
|
||||
MatrixState.popMatrix();
|
||||
//绘制茶壶
|
||||
MatrixState.pushMatrix();
|
||||
MatrixState.scale(1.5f, 1.5f, 1.5f);
|
||||
MatrixState.translate(0, 0, 10f);
|
||||
ch.drawSelf(situ);
|
||||
MatrixState.popMatrix();
|
||||
}
|
||||
|
||||
public void onSurfaceChanged(GL10 gl, int width, int height) {
|
||||
//设置视窗大小及位置
|
||||
GLES20.glViewport(0, 0, width, height);
|
||||
//计算GLSurfaceView的宽高比
|
||||
float ratio = (float) width / height;
|
||||
//调用此方法计算产生透视投影矩阵
|
||||
MatrixState.setProjectFrustum(-ratio, ratio, -1, 1, 2, 100);
|
||||
//计算摄像机的位置
|
||||
setCameraPostion();
|
||||
//计算灯光的位置
|
||||
setLightPostion();
|
||||
new Thread(){
|
||||
@Override
|
||||
public void run(){
|
||||
while(true){
|
||||
lightAzimuth +=1;
|
||||
lightAzimuth %= 360;
|
||||
//计算灯光的位置
|
||||
setLightPostion();
|
||||
try {
|
||||
Thread.sleep(50);
|
||||
} catch (InterruptedException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
}.start();
|
||||
}
|
||||
|
||||
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
|
||||
//设置屏幕背景色RGBA
|
||||
GLES20.glClearColor(0.3f,0.3f,0.3f,1.0f);
|
||||
//打开深度检测
|
||||
GLES20.glEnable(GLES20.GL_DEPTH_TEST);
|
||||
//关闭背面剪裁
|
||||
GLES20.glDisable(GLES20.GL_CULL_FACE);
|
||||
//初始化变换矩阵
|
||||
MatrixState.setInitStack();
|
||||
//加载要绘制的物体
|
||||
ch=LoadUtil.loadFromFileVertexOnlyAverage("ch.obj", MySurfaceView.this.getResources(),MySurfaceView.this);
|
||||
pm=LoadUtil.loadFromFileVertexOnlyFace("pm.obj", MySurfaceView.this.getResources(),MySurfaceView.this);;
|
||||
cft=LoadUtil.loadFromFileVertexOnlyFace("cft.obj", MySurfaceView.this.getResources(),MySurfaceView.this);;
|
||||
qt=LoadUtil.loadFromFileVertexOnlyAverage("qt.obj", MySurfaceView.this.getResources(),MySurfaceView.this);;
|
||||
yh=LoadUtil.loadFromFileVertexOnlyAverage("yh.obj", MySurfaceView.this.getResources(),MySurfaceView.this);;
|
||||
}
|
||||
}
|
||||
}
|
||||
66
第15章 真实光学环境的模拟/Sample15_7/src/com/bn/Sample15_7/Normal.java
Normal file
66
第15章 真实光学环境的模拟/Sample15_7/src/com/bn/Sample15_7/Normal.java
Normal file
@@ -0,0 +1,66 @@
|
||||
package com.bn.Sample15_7;
|
||||
|
||||
import java.util.Set;
|
||||
//表示法向量的类,此类的一个对象表示一个法向量
|
||||
public class Normal
|
||||
{
|
||||
public static final float DIFF=0.0000001f;//判断两个法向量是否相同的阈值
|
||||
//法向量在XYZ轴上的分量
|
||||
float nx;
|
||||
float ny;
|
||||
float nz;
|
||||
|
||||
public Normal(float nx,float ny,float nz)
|
||||
{
|
||||
this.nx=nx;
|
||||
this.ny=ny;
|
||||
this.nz=nz;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o)
|
||||
{
|
||||
if(o instanceof Normal)
|
||||
{//若两个法向量XYZ三个分量的差都小于指定的阈值则认为这两个法向量相等
|
||||
Normal tn=(Normal)o;
|
||||
if(Math.abs(nx-tn.nx)<DIFF&&
|
||||
Math.abs(ny-tn.ny)<DIFF&&
|
||||
Math.abs(ny-tn.ny)<DIFF
|
||||
)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
//由于要用到HashSet,因此一定要重写hashCode方法
|
||||
@Override
|
||||
public int hashCode()
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
//求法向量平均值的工具方法
|
||||
public static float[] getAverage(Set<Normal> sn)
|
||||
{
|
||||
//存放法向量和的数组
|
||||
float[] result=new float[3];
|
||||
//把集合中所有的法向量求和
|
||||
for(Normal n:sn)
|
||||
{
|
||||
result[0]+=n.nx;
|
||||
result[1]+=n.ny;
|
||||
result[2]+=n.nz;
|
||||
}
|
||||
//将求和后的法向量规格化
|
||||
return LoadUtil.vectorNormal(result);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,39 @@
|
||||
package com.bn.Sample15_7;
|
||||
import android.app.Activity;
|
||||
import android.content.pm.ActivityInfo;
|
||||
import android.os.Bundle;
|
||||
import android.view.Window;
|
||||
import android.view.WindowManager;
|
||||
|
||||
public class Sample15_7_Activity extends Activity {
|
||||
private MySurfaceView mGLSurfaceView;
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState)
|
||||
{
|
||||
super.onCreate(savedInstanceState);
|
||||
//设置为全屏
|
||||
requestWindowFeature(Window.FEATURE_NO_TITLE);
|
||||
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN ,
|
||||
WindowManager.LayoutParams.FLAG_FULLSCREEN);
|
||||
//设置为横屏模式
|
||||
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
|
||||
|
||||
//初始化GLSurfaceView
|
||||
mGLSurfaceView = new MySurfaceView(this);
|
||||
setContentView(mGLSurfaceView);
|
||||
mGLSurfaceView.requestFocus();//获取焦点
|
||||
mGLSurfaceView.setFocusableInTouchMode(true);//设置为可触控
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onResume() {
|
||||
super.onResume();
|
||||
mGLSurfaceView.onResume();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onPause() {
|
||||
super.onPause();
|
||||
mGLSurfaceView.onPause();
|
||||
}
|
||||
}
|
||||
126
第15章 真实光学环境的模拟/Sample15_7/src/com/bn/Sample15_7/ShaderUtil.java
Normal file
126
第15章 真实光学环境的模拟/Sample15_7/src/com/bn/Sample15_7/ShaderUtil.java
Normal file
@@ -0,0 +1,126 @@
|
||||
package com.bn.Sample15_7;
|
||||
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.InputStream;
|
||||
|
||||
import android.content.res.Resources;
|
||||
import android.opengl.GLES20;
|
||||
import android.util.Log;
|
||||
|
||||
//加载顶点Shader与片元Shader的工具类
|
||||
public class ShaderUtil
|
||||
{
|
||||
//加载制定shader的方法
|
||||
public static int loadShader
|
||||
(
|
||||
int shaderType, //shader的类型 GLES20.GL_VERTEX_SHADER GLES20.GL_FRAGMENT_SHADER
|
||||
String source //shader的脚本字符串
|
||||
)
|
||||
{
|
||||
//创建一个新shader
|
||||
int shader = GLES20.glCreateShader(shaderType);
|
||||
//若创建成功则加载shader
|
||||
if (shader != 0)
|
||||
{
|
||||
//加载shader的源代码
|
||||
GLES20.glShaderSource(shader, source);
|
||||
//编译shader
|
||||
GLES20.glCompileShader(shader);
|
||||
//存放编译成功shader数量的数组
|
||||
int[] compiled = new int[1];
|
||||
//获取Shader的编译情况
|
||||
GLES20.glGetShaderiv(shader, GLES20.GL_COMPILE_STATUS, compiled, 0);
|
||||
if (compiled[0] == 0)
|
||||
{//若编译失败则显示错误日志并删除此shader
|
||||
Log.e("ES20_ERROR", "Could not compile shader " + shaderType + ":");
|
||||
Log.e("ES20_ERROR", GLES20.glGetShaderInfoLog(shader));
|
||||
GLES20.glDeleteShader(shader);
|
||||
shader = 0;
|
||||
}
|
||||
}
|
||||
return shader;
|
||||
}
|
||||
|
||||
//创建shader程序的方法
|
||||
public static int createProgram(String vertexSource, String fragmentSource)
|
||||
{
|
||||
//加载顶点着色器
|
||||
int vertexShader = loadShader(GLES20.GL_VERTEX_SHADER, vertexSource);
|
||||
if (vertexShader == 0)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
//加载片元着色器
|
||||
int pixelShader = loadShader(GLES20.GL_FRAGMENT_SHADER, fragmentSource);
|
||||
if (pixelShader == 0)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
//创建程序
|
||||
int program = GLES20.glCreateProgram();
|
||||
//若程序创建成功则向程序中加入顶点着色器与片元着色器
|
||||
if (program != 0)
|
||||
{
|
||||
//向程序中加入顶点着色器
|
||||
GLES20.glAttachShader(program, vertexShader);
|
||||
checkGlError("glAttachShader");
|
||||
//向程序中加入片元着色器
|
||||
GLES20.glAttachShader(program, pixelShader);
|
||||
checkGlError("glAttachShader");
|
||||
//链接程序
|
||||
GLES20.glLinkProgram(program);
|
||||
//存放链接成功program数量的数组
|
||||
int[] linkStatus = new int[1];
|
||||
//获取program的链接情况
|
||||
GLES20.glGetProgramiv(program, GLES20.GL_LINK_STATUS, linkStatus, 0);
|
||||
//若链接失败则报错并删除程序
|
||||
if (linkStatus[0] != GLES20.GL_TRUE)
|
||||
{
|
||||
Log.e("ES20_ERROR", "Could not link program: ");
|
||||
Log.e("ES20_ERROR", GLES20.glGetProgramInfoLog(program));
|
||||
GLES20.glDeleteProgram(program);
|
||||
program = 0;
|
||||
}
|
||||
}
|
||||
return program;
|
||||
}
|
||||
|
||||
//检查每一步操作是否有错误的方法
|
||||
public static void checkGlError(String op)
|
||||
{
|
||||
int error;
|
||||
while ((error = GLES20.glGetError()) != GLES20.GL_NO_ERROR)
|
||||
{
|
||||
Log.e("ES20_ERROR", op + ": glError " + error);
|
||||
throw new RuntimeException(op + ": glError " + error);
|
||||
}
|
||||
}
|
||||
|
||||
//从sh脚本中加载shader内容的方法
|
||||
public static String loadFromAssetsFile(String fname,Resources r)
|
||||
{
|
||||
String result=null;
|
||||
try
|
||||
{
|
||||
InputStream in=r.getAssets().open(fname);
|
||||
int ch=0;
|
||||
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||
while((ch=in.read())!=-1)
|
||||
{
|
||||
baos.write(ch);
|
||||
}
|
||||
byte[] buff=baos.toByteArray();
|
||||
baos.close();
|
||||
in.close();
|
||||
result=new String(buff,"UTF-8");
|
||||
result=result.replaceAll("\\r\\n","\n");
|
||||
}
|
||||
catch(Exception e)
|
||||
{
|
||||
e.printStackTrace();
|
||||
}
|
||||
return result;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user