我正在同时学习ARKit和Scenekit,这是一个挑战.
创建了ARWorldTrackingSessionConfiguration会话后,我想知道是否有人知道在场景会话中获取用户"相机"位置的方法.我的想法是想要将对象设置为用户当前位置的动画.
let reaperScene = SCNScene(named: "reaper.dae")!
let reaperNode = reaperScene.rootNode.childNode(withName: "reaper", recursively: true)!
reaperNode.position = SCNVector3Make(0, 0, -1)
let scene = SCNScene()
scene.rootNode.addChildNode(reaperNode)
// some unknown amount of time later
let currentCameraPosition = sceneView.pointOfView?.position
let moveAction = SCNAction.move(to: currentCameraPosition!, duration: 1.0)
reaperNode.runAction(moveAction)
Run Code Online (Sandbox Code Playgroud)
但是,即使我正在移动相机,似乎currentCameraPosition总是[0,0,0].知道我做错了什么吗?最终的想法是我会旋转对象围绕一个看不见的球体,直到它在镜头前,然后动画它,做一些与此类似:旋转SCNCamera节点看着周围的假想球体的对象(这种方式,用户看到对象动画的对象)
谢谢你的帮助.
如果有的话,将Apple的新ARKit用于多个用户/设备的最佳方式是什么?
似乎每个设备都有自己独立的场景理解.到目前为止,我最好的猜测是使用原始特征点位置并尝试在不同设备上匹配它们以将不同的视点粘合在一起,因为ARKit不提供任何绝对参考参考.
=== Edit1,我尝试过的东西===
1)特征点
我已经玩过暴露的原始特征点,我现在确信在他们目前的状态下他们是死路一条:
总的来说,我认为尝试以某种有意义的方式使用它们是不合理的,不能在一个设备中进行任何类型的好点匹配,更不用说几个.替代方案是实现我自己的特征点检测和匹配,但这将更多地取代ARKit而不是利用它.
2)QR码
正如@Rickster建议的那样,我也尝试识别一个容易识别的对象,如QR码,并从该固定点获得相对参考变化(请参阅此问题)这有点困难,并暗示我使用一些openCV来估计相机姿势.但更重要的是非常有限
我想要capture
一个真实世界的纹理,并将其应用于在激光雷达扫描仪的帮助下生成的 3D 网格。我想应该使用 Projection-View-Model 矩阵。纹理必须从固定的视点制作,例如,从房间的中心。但是,如果我们可以应用environmentTexturing
作为cube-map
场景中的纹理收集的数据,这将是一个理想的解决方案。
看看3D 扫描仪应用程序。这是一个参考应用程序,允许我们导出带有纹理的模型。
我需要通过一次迭代来捕获纹理。我不需要实时更新它。我意识到改变 PoV 会导致错误的纹理感知,换句话说,纹理失真。我也意识到 RealityKit 中有一个动态细分,并且有一个自动纹理 mipmapping(纹理的分辨率取决于它捕获的距离)。
import RealityKit
import ARKit
import MetalKit
import ModelIO
class ViewController: UIViewController, ARSessionDelegate {
@IBOutlet var arView: ARView!
override func viewDidLoad() {
super.viewDidLoad()
arView.session.delegate = self
arView.debugOptions.insert(.showSceneUnderstanding)
let config = ARWorldTrackingConfiguration()
config.sceneReconstruction = .mesh
config.environmentTexturing = .manual
arView.session.run(config)
}
}
Run Code Online (Sandbox Code Playgroud)
我正在使用iPhone X并ARFaceKit
捕捉用户的脸部.目标是使用用户的图像纹理面部网格.
我只是ARFrame
从AR
会话中看一帧(一).从ARFaceGeometry
,我有一组描述脸部的顶点.我制作了当前帧的jpeg表示capturedImage
.
然后我想找到将创建的jpeg映射到网格顶点的纹理坐标.我想:1.将顶点从模型空间映射到世界空间; 2.将顶点从世界空间映射到摄像机空间; 3.除以图像尺寸以获得纹理的像素坐标.
let geometry: ARFaceGeometry = contentUpdater.faceGeometry!
let theCamera = session.currentFrame?.camera
let theFaceAnchor:SCNNode = contentUpdater.faceNode
let anchorTransform = float4x4((theFaceAnchor?.transform)!)
for index in 0..<totalVertices {
let vertex = geometry.vertices[index]
// Step 1: Model space to world space, using the anchor's transform
let vertex4 = float4(vertex.x, vertex.y, vertex.z, 1.0)
let worldSpace = anchorTransform * vertex4
// Step 2: World space to camera space
let world3 = float3(worldSpace.x, worldSpace.y, …
Run Code Online (Sandbox Code Playgroud) 我很难将设备运动(传感器融合)映射到SceneKit节点旋转.问题的前提如下,
我有球体,并且相机定位在球体内部,使得球体的几何中心和相机节点的中心重合.我想要实现的是当我围绕一个点物理旋转时,运动也需要准确地映射到相机上.
实施细节如下:
我有一个节点,一个球体作为几何,并且是一个子节点.我正在使用传感器融合来获得姿态四元数,然后将它们转换为欧拉角.代码是:
- (SCNVector3)eulerAnglesFromCMQuaternion:(CMQuaternion) {
GLKQuaternion gq1 = GLKQuaternionMakeWithAngleAndAxis(GLKMathDegreesToRadians(90), 1, 0, 0);
GLKQuaternion gq2 = GLKQuaternionMake(q.x, q.y, q.z, q.w);
GLKQuaternion qp = GLKQuaternionMultiply(gq1, gq2);
CMQuaternion rq = {.x = qp.x, .y = qp.y, .z = qp.z, .w = qp.w};
CGFloat roll = atan2(-rq.x*rq.z - rq.w*rq.y, .5 - rq.y*rq.y - rq.z*rq.z);
CGFloat pitch = asin(-2*(rq.y*rq.z + rq.w*rq.x));
CGFloat yaw = atan2(rq.x*rq.y - rq.w*rq.z, .5 - rq.x*rq.x - rq.z*rq.z);
return SCNVector3Make(roll, pitch, yaw);
}
Run Code Online (Sandbox Code Playgroud)
转换方程式来自 3D Math Primer for Graphics …
我正在研究Swift/Cocoa/Xcode应用程序.
此应用程序包含SceneKit视图.渲染API设置为Default(我认为这是Metal).
如果我snapshot()
在这个SceneKit视图对象上运行,我收到此错误消息.我想要做的是从相机中捕获场景的UIImage
Texture PixelFormat MTLPixelFormatBGRA8Unorm does not match Resolve PixelFormat MTLPixelFormatRGBA8Unorm
Run Code Online (Sandbox Code Playgroud)
如果我将渲染API设置为OpenGL
,我没有错误,一切正常.
我在iOS应用程序上尝试过相同的东西,它适用于两种情况(Metal或OpenGL).
我不明白为什么我会收到这个错误,我应该怎么做以避免它.
这是示例代码:
import SceneKit
import Cocoa
class ViewController: NSViewController {
@IBOutlet weak var vue_scene: SCNView!
@IBOutlet weak var img_snapshot: NSImageView!
let camera_node = SCNNode()
var box_node:SCNNode = SCNNode()
override func viewDidLoad() {
super.viewDidLoad()
let scene = SCNScene()
vue_scene.scene = scene
vue_scene.backgroundColor = NSColor.clear
vue_scene.showsStatistics = false
vue_scene.allowsCameraControl = false
vue_scene.autoenablesDefaultLighting = true
camera_node.camera = SCNCamera()
camera_node.camera?.zNear = 0.01
camera_node.camera?.zFar = 1000000.0
vue_scene.pointOfView …
Run Code Online (Sandbox Code Playgroud) 我已经尝试了很长一段时间向 SwiftUI Menu() 的标签添加自定义按钮样式/行为,但到目前为止还没有取得任何成功。这是我想要实现的目标的示例:
自定义按钮样式
假设我有一个自定义按钮样式,可以让按钮的文本在按下时变为红色。
struct RedButtonStyle: ButtonStyle {
func makeBody(configuration: Configuration) -> some View {
configuration.label
.foregroundColor(configuration.isPressed ? .red : .primary)
}
Run Code Online (Sandbox Code Playgroud)
菜单
另外,我有一个标准的 SwiftUI 菜单。
Menu("Menu button", content: {
// Some menu content goes here
})
Run Code Online (Sandbox Code Playgroud)
在此配置中,SwiftUI 菜单以强调色(系统蓝色)显示一个标准按钮,其行为类似于标准按钮(按下时变灰)。按下后,菜单将按预期显示。
自定义菜单按钮
现在我想以某种方式将自定义按钮样式应用到菜单正在使用的按钮。我尝试的是以下内容:
Menu(content: {
// Some menu content goes here
}, label: {
Button("Menu button", action: { })
.buttonStyle(RedButtonStyle())
})
Run Code Online (Sandbox Code Playgroud)
然而,菜单按钮的行为根本没有改变——按下时它仍然只是变灰,而不是变成红色。
我还尝试了创建自定义菜单样式,但到目前为止还没有取得任何成功。
对此有何建议?谢谢!
我似乎无法找到此视频片段的错误.
<video poster="sample.jpg" loop autoplay controls muted playsinline>
<source type="video/webm" src="sample.webm"></source>
<source type="video/mp4" src="sample.mp4"></source>
</video>
Run Code Online (Sandbox Code Playgroud)
视频在Safari中没有任何问题播放(没有针对早期版本的iOS进行测试,但我唯一担心的是自动播放问题?),但在Chrome上我唯一看到的是封面图片和播放按钮触发任何事情.我错过了什么吗?我真的需要使用JS才能让它工作吗?
更新:使用iOS Chrome播放Webm文件似乎存在问题 - 我尝试了来自不同位置的多个文件,似乎需要首先下载才能播放.
有可能计算两个之间的距离HitResult
吗?
或者我们如何使用ARCore计算实际距离(例如米)?
我正在为我的AR应用程序提供屏幕截图功能,我注意到我拍摄的截图(通过sceneView.snapshot()
)比我从相机看到的更暗.我正在使用Apple的ARKit示例代码,似乎这会影响它:
camera.wantsHDR = true
camera.wantsExposureAdaptation = true
camera.exposureOffset = -1
camera.minimumExposure = -1
camera.maximumExposure = 3
Run Code Online (Sandbox Code Playgroud)
当我删除曝光设置时,快照工作正常.有什么方法可以确保快照考虑那些曝光设置?
arkit ×5
swift ×5
scenekit ×4
metal ×2
3d ×1
android ×1
arcore ×1
button ×1
core-motion ×1
euler-angles ×1
html ×1
ios ×1
ios10 ×1
ios11 ×1
iphone-x ×1
java ×1
macos ×1
menu ×1
multiplayer ×1
objective-c ×1
playback ×1
quaternions ×1
realitykit ×1
styling ×1
swiftui ×1
video ×1
xcode ×1