- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我从 Sketchfab 下载了两个不同的 3D 模型。我在 ARKit 3D 对象放置中导入了两个模型。放置 3D 模型时,节点未与其中一个模型的操纵器正确对齐。我附上了截图。
左侧是所选节点(视口(viewport))和操纵器正确对齐的位置。但是右侧选定的节点(视口(viewport))和操纵器没有正确对齐。我如何使节点和操纵器像左侧 3D 模型一样对齐到中心。请指导我。谢谢
@乔希·罗宾斯
我已经尝试了您的代码,但我仍然遇到同样的问题。
box.firstMaterial?.emission.contents = UIColor.green
box.firstMaterial?.shaderModifiers = [SCNShaderModifierEntryPoint.surface: sm]
box.firstMaterial?.isDoubleSided = true
let boxNode = SCNNode(geometry: box)
boxNode.position = SCNVector3(node.position.x,(node.position.y + Float((proheights * 0.0234)/2)),node.position.z)
let minimum = float3(treenode.boundingBox.min)
let maximum = float3(treenode.boundingBox.max)
let translation = (maximum - minimum) * 0.5
//3. Set The Pivot
treenode.pivot = SCNMatrix4MakeTranslation(translation.x, translation.y, translation.z)
boxNode.pivot = SCNMatrix4MakeTranslation(translation.x, translation.y, translation.z)
self.addChildNode(boxNode)
更新代码
let treenode = SCNNode()
let box = SCNBox(width: (prowidths * 0.0234), height: (proheights * 0.0234), length: (prolenght * 0.0234), chamferRadius: 0)
box.firstMaterial?.emission.contents = UIColor.green
box.firstMaterial?.shaderModifiers = [SCNShaderModifierEntryPoint.surface: sm]
box.firstMaterial?.isDoubleSided = true
let boxNode = SCNNode(geometry: box)
boxNode.position = SCNVector3(treenode.position.x,(treenode.position.y + Float((proheights * 0.0234)/2)),treenode.position.z)
let minimum = float3(treenode.boundingBox.min)
let maximum = float3(treenode.boundingBox.max)
let translation = (maximum - minimum) * 0.5
//3. Set The Pivot
treenode.pivot = SCNMatrix4MakeTranslation(translation.x, translation.y, translation.z)
boxNode.pivot = SCNMatrix4MakeTranslation(translation.x, translation.y, translation.z)
self.addChildNode(boxNode)
self.addChildNode(treenode)
return treenode
最佳答案
这似乎是一个热门问题。几分钟前我刚刚回答了一个类似的问题。查看下面的此功能是否有助于在不移动其位置的情况下将节点的枢轴居中。
set pivot of SCNNode to bounding volume center without changing the node's position
func centerPivotWithOutMoving(for node: SCNNode) -> SCNNode {
let initialPos = treenode.presentation.position
var min = SCNVector3Zero
var max = SCNVector3Zero
node.__getBoundingBoxMin(&min, max: &max)
node.pivot = SCNMatrix4MakeTranslation(
min.x + (max.x - min.x)/2,
min.y + (max.y - min.y)/2,
min.z + (max.z - min.z)/2
)
let correctX = Float(min.x + (max.x - min.x)/2)
let correctY = Float(min.y + (max.y - min.y)/2)
let correctZ = Float(min.z + (max.z - min.z)/2)
if node.convertVector(SCNVector3(0,0,1), from: parentNode).z < 0 {
// if blue local z-axis is pointing downwards
node.position = SCNVector3(initialPos.x - correctX, initialPos.y - correctY, initialPos.z - correctZ)
} else {
// if blue local z-axis is pointing upwards
node.position = SCNVector3(initialPos.x + correctX, initialPos.y + correctY, initialPos.z + correctZ)
}
return node
}
要使用上面的函数,请执行以下操作:
centerPivotWithOutMoving(for: treenode)
编辑: 我意识到我上面的方法并不是解决所有情况下的 centerPivotWithOutMoving 的最有效方法,因为在某些情况下,局部轴您尝试将枢轴居中的子节点可能与 ParentNode 轴不共面(局部轴和父轴共享同一平面)。一个更好的方法是在每个你想要将枢轴居中的节点周围放置一个 wrapperNode。
当轴不共面时,类似这样的东西将包裹每个节点以解决潜在问题。
for child in (self.parentNode?.childNodes)! {
let wrapperNode = SCNNode()
child.geometry?.firstMaterial?.lightingModel = .physicallyBased
wrapperNode.addChildNode(child)
wrapperNode.name = child.name! + "_wrapper"
self.parentNode.addChildNode(wrapperNode)
}
我暂时这样做是为了在进入场景时在所有子节点上调用 CenerPivotWithOutMoving。
for child in parentNode.childNodes {
let delayInSeconds = Double(0.1)
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + delayInSeconds) {
self.centerPivotWithOutMoving(for: child)
}
}
这里是修改后的 centerPivotWithOutMoving,添加了一些代码,用于针对父级测试局部轴,只是为了显示它们现在对于所有包装器节点都是 1,1,1。如果没有包装器节点,这些数字在大多数情况下永远不会是 1、1、1。
func centerPivot(for node: SCNNode) -> SCNNode {
var min = SCNVector3Zero
var max = SCNVector3Zero
node.__getBoundingBoxMin(&min, max: &max)
node.pivot = SCNMatrix4MakeTranslation(
min.x + (max.x - min.x)/2,
min.y + (max.y - min.y)/2,
min.z + (max.z - min.z)/2
)
return node
}
func centerPivotWithOutMoving(for node: SCNNode) -> SCNNode {
let initialPos = node.presentation.position
var min = SCNVector3Zero
var max = SCNVector3Zero
node.__getBoundingBoxMin(&min, max: &max)
// corrective factor for each axis
let correctX = Float(min.x + (max.x - min.x)/2)
let correctY = Float(min.y + (max.y - min.y)/2)
let correctZ = Float(min.z + (max.z - min.z)/2)
var xAxis = node.convertVector(SCNVector3(1,0,0), from: parentNode).x
var yAxis = node.convertVector(SCNVector3(0,1,0), from: parentNode).y
var zAxis = node.convertVector(SCNVector3(0,0,1), from: parentNode).z
// check the local axis is coplanar with parentNode axis
if (xAxis == 1) && (yAxis == 1) && (zAxis == 1) {
print(node.name)
centerPivot(for: node)
node.position = SCNVector3(initialPos.x + correctX, initialPos.y + correctY, initialPos.z + correctZ)
} else {
print("node axis is not coplanar with parent")
}
return node
}
关于ios - ARKit - 如何在 SceneKit 编辑器中使用节点中心设置操纵器位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49129325/
我正在尝试绘制一个可以帮助某人了解元素尺寸的盒子,但我一直遇到一个问题,因为当我将物理元素放在飞机顶部时,我首先需要识别飞机,所以我的盒子被画了进去项目的前面。 是否有可能以某种方式克服这一点? 最佳
我正在用 swift 4 制作一个简单的标尺 ARKit 应用。 但我遇到的问题是,有时我的措施有一点偏差或完全偏差。我认为,这可能是因为 ARkit 校准不当,没有正确检测到我的表面。 我目前在 3
我一直在用 ARKit 构建一个门户,虽然构建一个虚拟环境很容易创建和移动,但我想让我进入一个重复播放 360 度视频的环境。我认为可以通过将 360 度视频作为纹理包装到球体来完成,但 ARKit
我正在尝试向场景中的每个节点添加动画。我的一个问题是,在层次结构中 - 我应该将动画添加到哪个节点。我认为它是由您实际看到的内容所代表的节点,这将是网格对象...但我有一个持有两个灯和网格对象的节点.
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题吗? 通过 editing this post 添加细节并澄清问题. 关闭 2 年前。 Improve t
我正在使用 ARKit 进行 AR 项目。 我想添加一个 UIView 到 ARKit 场景。当我点击一个对象时,我想获取该对象旁边的“弹出窗口”信息。此信息位于 UIView 中。 是否可以将此 U
我想使用 Vuforia 检测标记并在其上放置一个 3d 对象。从那时起,我想在我的应用程序中使用 ARKit。我如何知道检测到的标记或 3d 对象的 ARKit 世界变换? 我正在使用相同的 Vie
我上下阅读了所有 ARKit 类的完整文档。我没有看到任何描述实际获取用户面部纹理的能力的地方。 ARFaceAnchor 包含 ARFaceGeometry(由顶点组成的拓扑和几何)和 BlendS
我正在使用 ARKit 2 和 ARWorldMapData 我创建了一个 AR 世界,它可以使用来自 link here 的 map 数据等识别您的周围环境.现在我正在尝试弄清楚如何获取所有特征点并
我正在使用 ARKit 将虚拟对象放置在真实环境中。它在 Xcode 9 和 iOS 11 中运行良好。但是当我更新 Xcode 和 iOS 时,如果我将虚拟对象放在检测到的平面上,它就会卡住,如果我
我收到关于 init() 的错误消息不适用于 ARLightEstimate . 代码: class LightSensorManager { let lightEstimate = ARLi
我需要使用 ARKit 检测虚拟对象何时与现实世界对象接触。 有什么办法可以查出来吗? 最佳答案 首先您需要创建一个符合OptionSet 协议(protocol)并具有bitset 类型属性的碰撞类
我想实现类似的东西 ARCore's raycast method它采用世界空间坐标中的任意光线而不是屏幕空间点: List hitTest (float[] origin3, int originO
嗨,我正在尝试在节点周围产生发光效果。我使用了 SCNNode 过滤器属性并设置为 CIFilter 数组。 仅当节点后面没有我不理解的节点时,它才起作用并呈现。我尝试设置渲染顺序和 readDept
我正在尝试重现 ARCamera 的项目点函数,但由于某种原因,这些值没有正确匹配。我正在使用 ARCamera 的投影矩阵和 View 矩阵并应用基本的 CG 透视变换数学,(PV) * p,但 N
我想获得所有三个轴的旋转度数。我正在尝试用横向模式来实现。当从左向右旋转设备(Y 旋转)时,我希望一旦用户设置左端并向右旋转即可覆盖度数。所以当它到达起点时我们需要 360 度。所以对于y轴旋转,使用
我正在使用新的 ARKit,并且能够创建一个名为 SphereNode 的新文件,该文件能够在 View 上创建可放置的 Sphere。 重点是我真的想添加一个自定义对象而不是标准球体。一些建议?这是
我一直在使用 ARkit 并且很喜欢它,但我注意到在负载跟踪期间可能会有点跳动(突然物体从它们的位置跳出一点点,比如 1-3 厘米)。我一直在想是否有一种方法可以平滑这些跳跃,这样就不会那么分散注意力
我正在尝试从以下内容中检索 string=Gate。 | geometryIndex=0 node= | no child> bone=(null)> MyCode 访问几何并且工作正常,如下 l
我正在尝试使用 ARKit 构建家具放置 AR 应用程序,我的项目中有 .scn 椅子及其 PNG 纹理,我的应用程序应该检测水平面,然后当用户点击时,将对象放置在点击的位置。 但是当我点击时,该对象
我是一名优秀的程序员,十分优秀!