cur3d()函数返回值是否符合预期?R语言rgl包场景测试疑问
问题解答:这不是
cur3d()的正确行为,问题出在代码的鼠标回调绑定逻辑 核心问题分析
你的代码存在两个关键错误,导致所有cur3d()调用都返回同一个值:
鼠标回调绑定目标错误
rgl.setMouseCallbacks()的第一个参数应为要绑定回调的子场景(subscene)ID,但你在func1和func2里都硬编码传了1,导致两个函数的回调都绑定到了同一个子场景,而非各自创建的func1.scene.id和func2.scene.id。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,提问作者大根おろし
相关产品推荐
相关产品推荐

