【问题标题】:Scene Kit vehicle wheels disconnected from chassisScene Kit 车轮与底盘断开连接
【发布时间】:2018-11-06 12:35:59
【问题描述】:

我正在尝试制作一个简单的车辆演示。如果我创建的底盘和车轮最初漂浮在地板上,那么车轮会立即落到地板上,但底盘只是漂浮在它们上方。

如果我构建场景以使轮子开始停留在地板上,那么它们会停留在那里,但底盘会向上漂浮(!),直到它悬停在轮子上方的空中。慢慢飘起来,很流畅的动画。

您建议我如何解决此问题?

//
//  Experiment1.swift
//  SKTrailerTow
//
//  Created by Philip Delaquess on 11/3/18.
//  Copyright © 2018 Philip Delaquess. All rights reserved.
//

import SceneKit

class Experiment1 : SCNScene {

    var chasis : SCNNode!

    override init () {
        super.init()

        addLights()
        addCamera()
        addFloor()
        addTractor()
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    private func addLights () {
        let omni = SCNNode()
        omni.position = SCNVector3Make(0, 5, 0)
        omni.light = SCNLight()
        omni.light!.type = .omni
        self.rootNode.addChildNode(omni)
    }

    private func addCamera () {
        let camera = SCNNode()
        camera.position = SCNVector3Make(2.3, 1.4, 2.4)
        camera.camera = SCNCamera()
        self.rootNode.addChildNode(camera)

        let origin = SCNNode()
        self.rootNode.addChildNode(origin)
        let lookAt = SCNLookAtConstraint(target: origin)
        camera.constraints = [lookAt]
    }

    private func addFloor () {
        let floor = SCNNode()
        floor.position = SCNVector3Make(0, -0.1, 0)
        floor.geometry = SCNFloor()

        let body = SCNPhysicsBody.static()
        floor.physicsBody = body

        self.rootNode.addChildNode(floor)
    }

    private func addTractor () {
        chasis = SCNNode()
        chasis.position = SCNVector3Make(0, 0, 0)
        chasis.geometry = SCNBox(width: 0.5, height: 0.1, length: 1.0, chamferRadius: 0.0)
        chasis.geometry!.firstMaterial!.diffuse.contents = UIColor.yellow
        chasis.geometry!.firstMaterial!.specular.contents = UIColor.white

        let body = SCNPhysicsBody.dynamic()

        body.allowsResting = false
        body.mass = 80
        body.restitution = 0.1
        body.friction = 0.5
        body.rollingFriction = 0
        chasis.physicsBody = body
        self.rootNode.addChildNode(chasis)

        let flWheel = addWheel(toNode: chasis, atPosition: SCNVector3Make(0.25, 0, 0.5))
        let frWheel = addWheel(toNode: chasis, atPosition: SCNVector3Make(-0.25, 0, 0.5))
        let blWheel = addWheel(toNode: chasis, atPosition: SCNVector3Make(0.25, 0, -0.5))
        let brWheel = addWheel(toNode: chasis, atPosition: SCNVector3Make(-0.25, 0, -0.5))

        let vehicle = SCNPhysicsVehicle(chassisBody: body, wheels: [flWheel, frWheel, blWheel, brWheel])
        self.physicsWorld.addBehavior(vehicle)

    }

    private func addWheel (toNode node: SCNNode, atPosition pos: SCNVector3) -> SCNPhysicsVehicleWheel {
        let wheelNode = SCNNode()
        node.addChildNode(wheelNode)
        wheelNode.position = pos
        wheelNode.geometry = SCNSphere(radius: 0.1)
        wheelNode.geometry!.firstMaterial!.diffuse.contents = UIColor.red

        let wheel = SCNPhysicsVehicleWheel(node: wheelNode)
        let connPos = SCNVector3Make(pos.x * 1.5, pos.y, pos.z)
        wheel.connectionPosition = connPos

        return wheel
    }
}

【问题讨论】:

    标签: ios scenekit


    【解决方案1】:

    自己想出来的。显然我的轮子太小了。 0.1 的半径不起作用。当我将所有数字文字乘以 10 时,它似乎工作得很好!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-01
      • 2012-11-08
      • 2019-07-28
      • 1970-01-01
      相关资源
      最近更新 更多