设为首页 加入收藏

TOP

如何用3D流体实现逼真水流效果?(二)
2023-07-23 13:32:02 】 浏览:142
Tags:何用 水流效
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(); } } }
  1. 在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>
  1. 在MainActivity中添加按钮回调。
public void onBtnRenderViewDemoClicked(View view) {
    // 如果未初始化,先初始化。
    if (!initialized) {
        initializeSceneKit();
        return;
    }
    // 跳转到SampleActivity。
    startActivity(new Intent(this, SampleActivity.class));
}
  1. 新建渲染视图子类XRenderView,需要在这个子类中添加相机与灯光组件,详情请见布置场景
.public class XRenderView extends RenderView {
    public XRenderView(Context context) {
        //...
        prepareScene();
    }
    //...
}
  1. 创建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);
        //...
    }
}
  1. 添加createFluidSecene方法用于流体布局

3D流体组件不支持动态加载,只有在流体场景初始化时设置,才生效

private Node fluidNode;
private void createFluidScene(Context context) {
    // 创建3D流体节点。
    fluidNode = renderView.getScene().createNode("fluidNode");
    // 添加3D流体组件。
    FluidComponent fluidComponent = fluidNode.addComponent(FluidComponent.descriptor());
}
  1. 创建流体边界形状,设置流体体积量
private void createFluidScene(Context context) {
    // ...


    // 创建球形流体边界形状。
    SdfSphereShape sphere = fluidComponent.createSdfSphereShape();
    // 设置球体半径。
    sphere.setRadius(12.0f);
    // 设置流体体积量。
    fluidComponent.setFluidVolume(0.4f);
}
  1. 注册传感器事件,获取加速度传感器信息
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);
    //...
}
  1. 复写传感器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
首页 上一页 1 2 3 下一页 尾页 2/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇汽车行业:充分借力数据价值,推.. 下一篇HMS Core 3D流体仿真技术,打造移..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目