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

cur3d()函数返回值是否符合预期?R语言rgl包场景测试疑问

问题解答:这不是cur3d()的正确行为,问题出在代码的鼠标回调绑定逻辑

核心问题分析

你的代码存在两个关键错误,导致所有cur3d()调用都返回同一个值:

  1. 鼠标回调绑定目标错误
    rgl.setMouseCallbacks()的第一个参数应为要绑定回调的子场景(subscene)ID,但你在func1和func2里都硬编码传了1,导致两个函数的回调都绑定到了同一个子场景,而非各自创建的func1.scene.id和func2.scene.id。

  2. cur3d()的取值逻辑
    cur3d()返回的是当前全局活跃的子场景ID,而非触发鼠标事件的子场景ID。你在函数结尾调用的useSubscene3d()会设置全局活跃子场景,而错误的回调绑定逻辑导致触发事件时不会自动切换到对应子场景,最终所有回调里的cur3d()都返回最后一次设置的全局活跃子场景ID。

修正后的代码

要让cur3d()返回触发事件的子场景ID,需调整回调绑定目标,并在回调内切换到对应子场景:

library(rgl)

func1 <- function() {
  func1.dev.id <- open3d()
  func1.scene.id <- newSubscene3d()
  
  begin <- function(x, y) {
    useSubscene3d(func1.scene.id)
    cat("func1:", cur3d(), "\n")
  }

  update <- function(x, y) {
    useSubscene3d(func1.scene.id)
    cat("func1:", cur3d(), "\n")
  }

  rgl.setMouseCallbacks(func1.scene.id, begin, update)
}


func2 <- function() {
  func2.dev.id <- open3d()
  func2.scene.id <- newSubscene3d()
  
  begin <- function(x, y) {
    useSubscene3d(func2.scene.id)
    cat("func2:", cur3d(), "\n")
  }

  update <- function(x, y) {
    useSubscene3d(func2.scene.id)
    cat("func2:", cur3d(), "\n")
  }

  rgl.setMouseCallbacks(func2.scene.id, begin, update)
}

修正后的预期行为

执行修正后的代码后,点击func1窗口时cur3d()会返回func1.scene.id的值,点击func2窗口时会返回func2.scene.id的值,二者不再一致。

内容的提问来源于stack exchange,提问作者大根おろし

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 14:28:32