You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ARKit中如何获取SceneView物体捏合缩放时的实时缩放比例?

获取SceneView捏合缩放比例并实时显示

首先,你需要给SceneView绑定捏合手势监听器,在手势回调里计算缩放比例,再实时更新UI展示就行。下面是具体的实现思路和代码示例:

1. 初始化捏合手势检测器

在你的Activity/Fragment里,先创建ScaleGestureDetector,它能帮你精准捕捉捏合操作的缩放因子:

private lateinit var scaleGestureDetector: ScaleGestureDetector
private var currentScaleFactor = 1.0f // 初始缩放比例为1(物体原始大小)

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    
    val sceneView = findViewById<SceneView>(R.id.sceneView)
    scaleGestureDetector = ScaleGestureDetector(this, object : ScaleGestureDetector.SimpleOnScaleGestureListener() {
        override fun onScale(detector: ScaleGestureDetector): Boolean {
            // 获取本次捏合的相对缩放因子(张开大于1,捏合小于1)
            val scaleFactor = detector.scaleFactor
            // 更新物体的总缩放比例
            currentScaleFactor *= scaleFactor
            
            // 建议添加缩放范围限制,避免物体缩太小或太大
            currentScaleFactor = currentScaleFactor.coerceIn(0.5f, 3.0f)
            
            // 把缩放比例应用到你已放置的物体上(你已经实现了这部分,这里做关联)
            yourObjectNode.localScale = Vector3(currentScaleFactor, currentScaleFactor, currentScaleFactor)
            
            // 实时更新屏幕上的缩放比例显示
            updateScaleDisplay(currentScaleFactor)
            
            return true
        }
    })
}

2. 传递触摸事件给手势检测器

SceneView的触摸事件需要传递给ScaleGestureDetector,才能触发捏合回调:

override fun onTouchEvent(event: MotionEvent): Boolean {
    scaleGestureDetector.onTouchEvent(event)
    return super.onTouchEvent(event)
}

3. 实时更新缩放比例显示

写个简单方法,把计算好的缩放比例展示在TextView里:

private fun updateScaleDisplay(scale: Float) {
    val scaleTextView = findViewById<TextView>(R.id.scaleTextView)
    // 格式化显示,保留两位小数更直观
    scaleTextView.text = String.format("当前缩放比例: %.2f", scale)
}

关键点说明

  • detector.scaleFactor:是每次捏合手势的相对变化值,比如手指张开时这个值大于1,捏合时小于1。
  • currentScaleFactor:记录物体的总缩放比例,初始为1(原始大小),每次捏合时乘以相对因子就能得到当前的实际缩放倍数。
  • 一定要加缩放范围限制,不然用户可能把物体缩到看不见或者大到超出屏幕,影响体验。

如果你的项目是用Java实现的,逻辑完全一致,只是语法调整下就行。比如Java版的回调:

scaleGestureDetector = new ScaleGestureDetector(this, new ScaleGestureDetector.SimpleOnScaleGestureListener() {
    @Override
    public boolean onScale(ScaleGestureDetector detector) {
        float scaleFactor = detector.getScaleFactor();
        currentScaleFactor *= scaleFactor;
        // 限制缩放范围
        currentScaleFactor = Math.max(0.5f, Math.min(currentScaleFactor, 3.0f));
        
        yourObjectNode.setLocalScale(new Vector3(currentScaleFactor, currentScaleFactor, currentScaleFactor));
        updateScaleDisplay(currentScaleFactor);
        
        return true;
    }
});

内容的提问来源于stack exchange,提问作者Sachin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 03:39:00