Raycaster レイが Three.js の点または線モデルを選択する場合、衝突範囲が小さすぎてオブジェクトを正確に検出できず、関連する設定で精度の問題が発生します。

Three.js では、Raycaster はシーン内のオブジェクトの交差を検出するために使用されるクラスです。Raycaster を使用してオブジェクトの交差を検出する場合、特に検出されたオブジェクトが点モデルまたは線モデルの場合、精度の問題が発生する可能性があります。これは、点と線分自体に厚みがないため、衝突領域が非常に小さく、オブジェクトの交差を正確に検出できない可能性があるためです。

ラインモデルソリューション (もちろん一般的な LineLoop と LineSegments)

Raycaster.linePrecision、linePrecision 属性はオプションの属性で、型は浮動小数点数で、デフォルト値は 1 です。これは、光線と線分の交点を計算するときに追加される追加の線分の太さを表します。このプロパティの値を設定すると、単位長さを線分の太さとして取り、それを線分の両側に追加して検出範囲を広げます。値が小さいと検出範囲が狭くなり交差点が検出できない場合があり、値が大きいと検出範囲は広くなりますが誤検出が発生する可能性があります。したがって、特定のアプリケーションでは適切な設定を行う必要があります。

const geometry = new THREE.BoxGeometry(100, 100, 100)
const material = new THREE.LineBasicMaterial({color: 0xff0000})
const line = new THREE.Line(geometry, material)
const raycaster = new THREE.Raycaster()
raycaster.linePrecision = 3 // 默认值为1,越大越容易选中线模型
const intersects = raycaster.intersectObjects([line, line2, line3])

 ポイント ポイントモデルソリューション

Raycaster.params.Points.threshold params 属性を使用して、Raycaster の属性値を取得または設定できます。このうち、params.Points.threshold 属性はオプションの属性で、型は浮動小数点数、デフォルト値は 1 です。これは、検出されたモデルの頂点セットが点群 (PointCloud) である場合に、Raycaster 検出器によって使用される精度のしきい値 (つまり、点と光線の交点を決定するための点と光線の間の距離) を示します。Raycaster を使用して点群を検出する場合、このしきい値属性は Raycaster のパス長の判断に影響し、それによって最も近いピクセル上の点の精度に影響します。点と光線の間の距離がこのプロパティの値より小さい場合、その点は交点とみなされ、intersects に返されます。

なお、検出精度が低すぎる(閾値が小さすぎる)場合には点が無視される可能性があり、精度が高すぎる(閾値が大きすぎる)場合には無関係な点が検出される可能性がある。

 

 

 

const geometry = new THREE.BoxGeometry(100, 100, 100)
const material = new THREE.PointsMaterial({color: 0xff0000, size: 10.0})
const points = new THREE.Points(geometry, material)
const raycaster = new THREE.Raycaster()
raycaster.params.Points.threshold = 5.0
const intersects = raycaster.intersectObjects([points])

おすすめ

転載: blog.csdn.net/dabaooooq/article/details/131045322