我刚刚将我的Xcode升级到6.1,现在得到一个奇怪的编译错误.
'init()'不可用:导入 - [NSObject init]取代
我是SCNNode的子类,并且对我定义的相同类型的其他类有可选引用.即
import UIKit
import SceneKit
class BayNode: SCNNode {
var leftBay:BayNode?
var rightBay:BayNode?
func addLeftBay()
{
leftBay = BayNode() // 'init()' is unavailable: superseded by import of -[NSObject init]
}
}
Run Code Online (Sandbox Code Playgroud)
有谁知道如何解决这个问题.
非常感谢
我在SceneKit中设置了一个场景,并发出了一个命中测试来选择一个项目.但是,我希望能够在场景中沿着平面移动该项目.我继续接收鼠标拖动事件,但不知道如何将这些2D坐标转换为场景中的3D坐标.
我的情况很简单.摄像机位于0,0,50并指向0,0,0.我只想沿z平面拖动我的对象,其z值为0.
命中测试就像魅力一样,但是如何将拖动事件中的鼠标点转换为我拖动的3D对象的场景中的新位置?
您好我已经仔细阅读了文档,无法弄清楚如何在场景工具包中设置碰撞检测.有人可以举个例子.请帮助我非常绝望地想出这个.谢谢!
编辑:您好,非常感谢,对不起,我忘了提到我的项目很快.没什么大不了的,我可以在很大程度上翻译自己.
我有BitMasks正常工作,因为对象相互碰撞和反弹.但是我似乎无法使功能发挥作用
func physicsWorld(world: SCNPhysicsWorld, didBeginContact contact: SCNPhysicsContact){
let contactMask = contact.nodeA.physicsBody!.categoryBitMask | contact.nodeB.physicsBody!.categoryBitMask
if (contactMask == (CollisionBallCategory | CollisionTerminatorCategory)) {
println("Collided")
}
}
Run Code Online (Sandbox Code Playgroud)
看看文档,我需要以某种方式将场景物理世界委托分配给此方法.我不知道该怎么做.
在学习游戏的3D图形编程时,我决定通过使用Scene Kit 3D API开始简单.我的第一个游戏目标是构建一个非常简化的模拟MineCraft.只是立方体的游戏 - 它有多难.
下面是我写的一个循环,用于放置100 x 100立方体(10,000)并且FPS性能非常差(~20 FPS).对于Scene Kit,我的初始游戏目标是否过多,或者有更好的方法来解决这个问题吗?
我已经阅读了StackExchange上的其他主题,但感觉不到他们回答我的问题.将暴露的表面块转换为单个网格将不起作用,因为SCNGeometry是不可变的.
func createBoxArray(scene : SCNScene, lengthCount: Int, depthCount: Int) {
let startX : CGFloat = -(CGFloat(lengthCount) * CUBE_SIZE) + (CGFloat(lengthCount) * CUBE_MARGIN) / 2.0
let startY : CGFloat = 0.0
let startZ : CGFloat = -(CGFloat(lengthCount) * CUBE_SIZE) + (CGFloat(lengthCount) * CUBE_MARGIN) / 2.0
var currentZ : CGFloat = startZ
for z in 0 ..< depthCount {
currentZ += CUBE_SIZE + CUBE_MARGIN
var currentX = startX
for x in …
Run Code Online (Sandbox Code Playgroud) 这是360度视频播放器项目.
我添加了一个cameranode(SCNNode
)到一个根节点,cameranode被放在了中心(0,0,0)SCNSphere
,它现在可以播放视频了.
现在我必须使用devicemotion.设备移动时我需要旋转相机.不只是旋转一定的角度.(不只是设备移动,当我拿着设备时,我的移动方式就像设备移动一样.因为我发现如果我使用deviceMotion.attitude.roll
,cameranode仅在设备自行移动时移动,而不是当我绕着设备移动时)
当设备位于(x1,y1,z1)位置时,cameranode将随设备移动而旋转,当设备再次位于(x1,y1,z1)位置时,视图应与我们离开的最后一个相同.
这就是我所做的:
if (self.motionManager.gyroAvailable) {
self.motionManager.gyroUpdateInterval = 1.0/60.0;
[self.motionManager startGyroUpdatesToQueue:self.queue withHandler:^(CMGyroData *gyroData, NSError *error){
if (error) {
[self.motionManager stopGyroUpdates];
NSLog(@"Gyroscope encountered error:%@",error);
}else {
CGFloat tempX = 0;
CGFloat tempY = 0;
CGFloat tempZ = 0;
if ((fabs(gyroData.rotationRate.y)/60) > 0.002) {
tempY = gyroData.rotationRate.y/60;
}
tempX = gyroData.rotationRate.x/60;
tempZ = gyroData.rotationRate.z/60;
[self.cameraNode runAction:[SCNAction rotateByX:-tempY y:tempX z:tempZ duration:0]];
}
}];
}else {
NSLog(@"This device has no gyroscope");
}
Run Code Online (Sandbox Code Playgroud)
数学可能是错误的,我不知道为什么我会划分60,但它似乎是我使用时所需的最接近的值 [self.cameraNode runAction:[SCNAction rotateByX:-tempY …
我正在向ARSCNSceneView场景添加多个透明SCNShape对象.
问题是重叠的形状是非常明显的,我希望它显示为一个单一的形状 - 所有形状的结合.
失败的方法:
我试图在现实世界中找到iOS设备的前置摄像头和用户脸部之间的距离.
到目前为止,我已经尝试过ARKit/SceneKit
,并且使用ARFaceAnchor
我能够检测用户与相机的面部距离; 但它只能靠近(最大约88厘米).我的应用要求面部距离检测高达200厘米.
我假设这可以在不使用trueDepth数据(正在使用ARFaceAnchor
)的情况下实现.
你能把我放在正确的方向吗?
我可以使用COLLADA/.dae格式导出在Blender中创建的网格,以便在SceneKit中使用 - 但iOS设备上不显示任何纹理.
此外,OS X上的预览不会打开从Blender导出的任何COLLADA文件 - 但是侧边栏预览会显示网格.出口使这项工作需要哪些选项?
我想在用户点击屏幕时创建一个新的SceneKit节点,并让它以预定距离直接出现在摄像机前面.对于测试,这将是一个SCNText读取"你在这里点击"的读数.它也应该与视线成直角 - 也就是说,"面向相机".
那么,鉴于self.camera.orientation
SCNVector4(或类似),我该如何:
我怀疑(2)的答案是它与`self.camera.orientation相同?但是(1)让我有点失落.
我看到了许多类似的问题,比如这个,但没有答案.
我试图从我的场景中删除表示路径的节点集.它们是SCNSphere几何节点和表示线的自定义几何的组合,使用SCNGeometrySource和SCNGeometryElement创建.
我没有在任何类型的数组中保留这些节点.相反,我按照名称搜索场景中rootNode的节点树的第一级,以及后续调用使它们淡出的动作序列,并且它们应该从根节点中删除它们自己.
代码如下:
func clearPath() {
//
let disappear = SCNAction.fadeOut(duration: 0.1)
let remove = SCNAction.removeFromParentNode()
let sequence = SCNAction.sequence([disappear, remove])
if let pathNodesToRemove = pathNodes() {
//
for node in pathNodesToRemove {
//
node.removeAllActions()
node.runAction(sequence)
}
}
if let lineNodesToRemove = lineNodes() {
for node in lineNodesToRemove {
//
node.removeAllActions()
node.runAction(sequence)
}
}
path.removeAll()
}
Run Code Online (Sandbox Code Playgroud)
哪里:
func pathNodes() -> [SCNNode]? {
//
...
let nodes = rootNode.childNodes.filter { (node) -> Bool in
//
guard let name = node.name else …
Run Code Online (Sandbox Code Playgroud) scenekit ×10
swift ×6
ios ×5
3d ×2
arkit ×2
blender ×1
collada ×1
ios8 ×1
opengl ×1
optimization ×1
performance ×1
scnnode ×1
swift3 ×1
uibezierpath ×1
xcode6.1 ×1