by Anonymous » 22 Aug 2025, 10:00
Ich benutze den Code unten, um ein flaches Objekt mit Koordinaten zu erstellen, die wir in einer zweioPointCircleview -Klasse erzeugen. Oberfläche oder Nichts.
Code: Select all
func createMetalMeshEntity(from dots: [TwoPointCircleView.Dots]) -> ModelEntity {
let flatVertices: [Double] = dots.flatMap { [Double($0.x), Double($0.y)] }
let frontIndices = Earcut.tessellate(data: flatVertices)
var positions: [SIMD3] = []
var indices: [UInt32] = []
// Front face (z = 0)
for dot in dots {
positions.append(SIMD3(Float(dot.x), Float(dot.y), posZ))
}
let dx = maxX - minX
let dy = maxY - minY
var uvs: [SIMD2] = []
let maxDim = max(dx, dy)
// Generate front face UVs
for dot in dots {
let u = (Float(dot.x) - Float(minX)) / Float(maxDim)
let v = (Float(dot.y) - Float(minY)) / Float(maxDim)
uvs.append(SIMD2(u, v))
}
// Front face
indices += frontIndices.map { UInt32($0) }
// Collection center points of pieces.
let center = centroid(of: positions)
centers.append(center)
// Descriptor
var descriptor = MeshDescriptor(name: "MetalSemicircle")
descriptor.positions = MeshBuffers.Positions(positions)
descriptor.primitives = .triangles(indices)
let tileFactor: Float = 1.0
let scaledUVs = uvs.map { uv in
SIMD2(uv.x * tileFactor, uv.y * tileFactor)
}
descriptor.textureCoordinates = MeshBuffers.TextureCoordinates(scaledUVs)
// Create mesh + entity
let meshResource = try! MeshResource.generate(from: [descriptor])
var applidedMaterial = PhysicallyBasedMaterial()
var solvedMaterial = PhysicallyBasedMaterial()
solvedMaterial.baseColor = .init(texture: .init(texture))
solvedMaterial.metallic = 0.5
solvedMaterial.roughness = 0.5
solvedMaterial.faceCulling = .none
face0Materials.append(solvedMaterial)
if faces[0].pieceModel.count < puzzleNumber {
var tempMaterial = PhysicallyBasedMaterial()
tempMaterial.baseColor = .init(tint: .gray)
tempMaterial.metallic = 0.5
tempMaterial.roughness = 0.5
applidedMaterial = tempMaterial
} else {
applidedMaterial = solvedMaterial
}
let entity = ModelEntity(mesh: meshResource, materials: [applidedMaterial])
entity.generateCollisionShapes(recursive: true)
return entity
}
Ich benutze den Code unten, um ein flaches Objekt mit Koordinaten zu erstellen, die wir in einer zweioPointCircleview -Klasse erzeugen. Oberfläche oder Nichts.[code]func createMetalMeshEntity(from dots: [TwoPointCircleView.Dots]) -> ModelEntity {
let flatVertices: [Double] = dots.flatMap { [Double($0.x), Double($0.y)] }
let frontIndices = Earcut.tessellate(data: flatVertices)
var positions: [SIMD3] = []
var indices: [UInt32] = []
// Front face (z = 0)
for dot in dots {
positions.append(SIMD3(Float(dot.x), Float(dot.y), posZ))
}
let dx = maxX - minX
let dy = maxY - minY
var uvs: [SIMD2] = []
let maxDim = max(dx, dy)
// Generate front face UVs
for dot in dots {
let u = (Float(dot.x) - Float(minX)) / Float(maxDim)
let v = (Float(dot.y) - Float(minY)) / Float(maxDim)
uvs.append(SIMD2(u, v))
}
// Front face
indices += frontIndices.map { UInt32($0) }
// Collection center points of pieces.
let center = centroid(of: positions)
centers.append(center)
// Descriptor
var descriptor = MeshDescriptor(name: "MetalSemicircle")
descriptor.positions = MeshBuffers.Positions(positions)
descriptor.primitives = .triangles(indices)
let tileFactor: Float = 1.0
let scaledUVs = uvs.map { uv in
SIMD2(uv.x * tileFactor, uv.y * tileFactor)
}
descriptor.textureCoordinates = MeshBuffers.TextureCoordinates(scaledUVs)
// Create mesh + entity
let meshResource = try! MeshResource.generate(from: [descriptor])
var applidedMaterial = PhysicallyBasedMaterial()
var solvedMaterial = PhysicallyBasedMaterial()
solvedMaterial.baseColor = .init(texture: .init(texture))
solvedMaterial.metallic = 0.5
solvedMaterial.roughness = 0.5
solvedMaterial.faceCulling = .none
face0Materials.append(solvedMaterial)
if faces[0].pieceModel.count < puzzleNumber {
var tempMaterial = PhysicallyBasedMaterial()
tempMaterial.baseColor = .init(tint: .gray)
tempMaterial.metallic = 0.5
tempMaterial.roughness = 0.5
applidedMaterial = tempMaterial
} else {
applidedMaterial = solvedMaterial
}
let entity = ModelEntity(mesh: meshResource, materials: [applidedMaterial])
entity.generateCollisionShapes(recursive: true)
return entity
}
[/code]