gpt4 book ai didi

swift - 如何使用 MDL 使用边界框进行 HitTest

转载 作者:搜寻专家 更新时间:2023-10-31 22:53:14 25 4
gpt4 key购买 nike

我正在尝试计算与 MDL 边界框的交集,我的代码基于 WM 在 http://metalbyexample.com/picking-hit-testing/#more-738 发表的精彩文章

t0 应该是最近点的想法 https://www.scratchapixel.com/lessons/3d-basic-rendering/minimal-ray-tracer-rendering-simple-shapes/ray-sphere-intersection

https://www.scratchapixel.com/lessons/3d-basic-rendering/minimal-ray-tracer-rendering-simple-shapes/ray-box-intersection

但这并没有发生

extension MDLAxisAlignedBoundingBox {

func intersect(_ ray: Ray) -> float4? {

var tmin = minBounds
var tmax = maxBounds

let inverseDirection = 1 / ray.direction

var sign : [Int] = [(inverseDirection.x < 0) ? 1 : 0,(inverseDirection.y < 0) ? 1 : 0,(inverseDirection.z < 0) ? 1 : 0]


var bounds : [float3] = [minBounds,maxBounds]


var t0 = Float(minBounds.z)

if ((tmin.x > tmax.y) || (tmin.y > tmax.x)){
return nil
}



if (tmin.y > tmin.x){
tmin.x = tmin.y;
}


if (tmax.y < tmax.x){
tmax.x = tmax.y;
}

tmin.z = (bounds[sign[2]].z - ray.origin.z) * inverseDirection.z
tmax.z = (bounds[1-sign[2]].z - ray.origin.z) * inverseDirection.z



if ((tmin.x > tmax.z) || (tmin.z > tmax.x)){
return nil
}

if (tmin.z > tmin.x){
tmin.x = tmin.z
t0 = tmin.x
}

if (tmax.z < tmax.x){
tmax.x = tmax.z
t0 = tmax.z
}


return float4(ray.origin + ray.direction * t0, 1)
}
}

预计到达最后的结果应该是最短的向量。

提前致谢

最佳答案

解决方法如下:

extension MDLAxisAlignedBoundingBox {

func intersect(_ ray: Ray) -> float4? {

var tmin = minBounds
var tmax = maxBounds

let inverseDirection = 1 / ray.direction

var sign : [Int] = [(inverseDirection.x < 0) ? 1 : 0,(inverseDirection.y < 0) ? 1 : 0,(inverseDirection.z < 0) ? 1 : 0]


var bounds : [float3] = [minBounds,maxBounds]


var t0 = Float(minBounds.z)

if ((tmin.x > tmax.y) || (tmin.y > tmax.x)){
return nil
}



if (tmin.y > tmin.x){
tmin.x = tmin.y;
}


if (tmax.y < tmax.x){
tmax.x = tmax.y;
}

tmin.z = (bounds[sign[2]].z - ray.origin.z) * inverseDirection.z
tmax.z = (bounds[1-sign[2]].z - ray.origin.z) * inverseDirection.z



if ((tmin.x > tmax.z) || (tmin.z > tmax.x)){
return nil
}

if (tmin.z > tmin.x){
tmin.x = tmin.z
t0 = tmin.x
}

if (tmax.z < tmax.x){
tmax.x = tmax.z
t0 = tmax.z
}


return float4(ray.origin + ray.direction * t0, 1)

}

}

您必须确保您指向正确的方向。

far / (near - far)

你的

eyeRayDir.z = -1

和相机位置

相机位置 = [0, 0, 15]

在你的节点类中你应该有

var boundingBox = MDLAxisAlignedBoundingBox()
var size: float3 {
return boundingBox.maxBounds - boundingBox.minBounds
}

希望对你有帮助

关于swift - 如何使用 MDL 使用边界框进行 HitTest ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55435228/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com