Не понимаю обнаружение столкновений IOS RealitykitIOS

Программируем под IOS
Ответить
Anonymous
 Не понимаю обнаружение столкновений IOS Realitykit

Сообщение Anonymous »

Я пытаюсь обнаружить столкновения между двумя объектами RealityKit, но результаты неожиданны. < /p>
Я таким образом создал минимальный пример. В приложении iOS ниже настраиваются 3 объекта:

a poard < /code>, фиксированная коробка < /code> и движущаяся поле < /code>.

Плата и 1 -я поле не перемещаются, в то время как 2 -я поле движется в направлении 1 -й поле. В ящиках есть режим столкновения, установленный на .trigger .

Оба поля принадлежат одной и той же группе CollisionGroup , и их фильтр столкновений устанавливается в эту группу. Если обнаружено столкновение, столкновение регистрируется. Столкновение не зарегистрировано. Я ожидал, что столкновение между обеими полями будет обнаружено.collision began between board and Fixed box
collision began between Fixed box and board
collision began between board and Moving box
collision began between Moving box and board
< /code>
Очевидно, что столкновение может быть обнаружено, но столкновение между обоими коробками не является. Но почему? < /P>
Вот мой код: < /p>
//
// CollisionApp.swift
// Collision
//
// Created by Reinhard Männer on 31.03.25.
//

import SwiftUI

@main
struct CollisionApp: App {
var body: some Scene {
WindowGroup {
ContentView()
}
}
}

//
// CollisionManager.swift
// Collision
//
// Created by Reinhard Männer on 31.03.25.
//

import Combine
import Foundation
import RealityKit

class CollisionManager {
var movementTimer: Timer?
private var updateVehicleCollisionSubscription: Cancellable?

func startVehicleCollisionTrigger(scene: RealityKit.Scene) {
updateVehicleCollisionSubscription = scene.subscribe(to: CollisionEvents.Began.self) { event in
let a = event.entityA
let b = event.entityB
print("collision began between \(a.name) and \(b.name)")
}
}

func startMovement(entity: Entity) {
movementTimer = Timer.scheduledTimer(withTimeInterval: 0.1, repeats: true) { timer in
if entity.position.x > 0 {
entity.position.x -= 0.02
} else {
timer.invalidate()
self.movementTimer = nil
}
}
}
}

//
// ContentView.swift
// Collision
//
// Created by Reinhard Männer on 31.03.25.
//

import RealityKit
import SwiftUI

struct ContentView: View {
let collisionManager = CollisionManager()
let boardHeight: Float = 0.1
let boxHeight: Float = 0.3

var body: some View {
var movingBox: Entity?

RealityView { content in
let board = makeBoard()
content.add(board)

let box1 = makeBox(name: "Fixed box")
board.addChild(box1)

movingBox = makeBox(name: "Moving box")
movingBox?.position.x = 0.8
board.addChild(movingBox!)
}
update: { content in
let scene = content.entities.first?.scene
collisionManager.startVehicleCollisionTrigger(scene: scene!)
collisionManager.startMovement(entity: movingBox!)
}
}

func makeBoard() -> ModelEntity {
let mesh = MeshResource.generateBox(width: 2.0, height: boardHeight, depth: 1.0)
var material = UnlitMaterial(); material.color.tint = .red
let boardEntity = ModelEntity(mesh: mesh, materials: [material])
boardEntity.name = "board"
boardEntity.generateCollisionShapes(recursive: false)

boardEntity.transform.translation = [0, 0, -3]
return boardEntity
}

func makeBox(name: String) -> ModelEntity {
let mesh = MeshResource.generateBox(width: 0.2, height: boxHeight, depth: 0.3)
var material = UnlitMaterial(); material.color.tint = .green
let boxEntity = ModelEntity(mesh: mesh, materials: [material])
boxEntity.name = name

// To put the box onto the board, move it up by half height of the board and half height of the box
let y_up = boardHeight/2.0 + boxHeight/2.0
boxEntity.position = SIMD3(0, y_up, 0)

// Allow to detect collisions between boxes only and to trigger code execution.
boxEntity.generateCollisionShapes(recursive: false)
boxEntity.collision!.mode = .trigger
let collisionGroup = CollisionGroup(rawValue: 1

Подробнее здесь: https://stackoverflow.com/questions/795 ... -detection
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»