getApplicationContext());
initialized = true;
Toast.makeText(this, "SceneKit initialized", Toast.LENGTH_SHORT).show();
} catch (Exception e) {
// 重新尝试初始化时不再捕获升级异常。
Toast.makeText(this, "failed to initialize SceneKit: " + e.getMessage(), Toast.LENGTH_SHORT).show();
}
}
}
- 在MainActivity的Layout文件中添加按钮,用于跳转至SampleActivity。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/btn_render_view_demo_text"
android:onClick="onBtnRenderViewDemoClicked"/>
</LinearLayout>
- 在MainActivity中添加按钮回调。
public void onBtnRenderViewDemoClicked(View view) {
// 如果未初始化,先初始化。
if (!initialized) {
initializeSceneKit();
return;
}
// 跳转到SampleActivity。
startActivity(new Intent(this, SampleActivity.class));
}
- 新建渲染视图子类XRenderView,需要在这个子类中添加相机与灯光组件,详情请见布置场景。
.public class XRenderView extends RenderView {
public XRenderView(Context context) {
//...
prepareScene();
}
//...
}
- 创建SampleActivity为展示效果页面
public class DemoActivity extends Activity implements SensorEventListener {
private XRenderView renderView;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
renderView = new XRenderView(this);
setContentView(renderView);
//...
}
}
- 添加createFluidSecene方法用于流体布局
3D流体组件不支持动态加载,只有在流体场景初始化时设置,才生效
private Node fluidNode;
private void createFluidScene(Context context) {
// 创建3D流体节点。
fluidNode = renderView.getScene().createNode("fluidNode");
// 添加3D流体组件。
FluidComponent fluidComponent = fluidNode.addComponent(FluidComponent.descriptor());
}
- 创建流体边界形状,设置流体体积量
private void createFluidScene(Context context) {
// ...
// 创建球形流体边界形状。
SdfSphereShape sphere = fluidComponent.createSdfSphereShape();
// 设置球体半径。
sphere.setRadius(12.0f);
// 设置流体体积量。
fluidComponent.setFluidVolume(0.4f);
}
- 注册传感器事件,获取加速度传感器信息
private SensorManager sensorManager;
private Sensor sensor;
private int rotation;
private void createFluidScene(Context context) {
// ...
sensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);
// 获取加速度传感器。
sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
}
@Override
protected void onResume() {
super.onResume();
// 注册传感器事件。
sensorManager.registerListener(this, sensor, SensorManager.SENSOR_DELAY_NORMAL);
//...
}
@Override
protected void onPause() {
super.onPause();
// 去注册传感器事件。
sensorManager.unregisterListener(this);
//...
}
- 复写传感器onSensorChanged方法,根据加速度传感器获取的值,更新流体系统的重力加速度。
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
@Override
public void onSensorChanged(SensorEvent event) {
if (event.sensor == null) {
return;
}
// 加速度传感器。
if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
int x = (int) event.values[0];
int y = (int) event.values[1];
int z = (int) event.values[2];
int gravityX = 0;
int gravityY = 0;
int gravityZ = 0;
// 屏幕的旋转信息。
ro