5

ですから、私はこの比較的単純なアルゴリズムに頭を悩ませてきました。コードの何が問題になっているのかわかりませんが、実際に交差している交差点を取得できていません。

Unity3Dを使用していて、x、y平面ではなく、x、z平面で2本の線が交差する点を見つけようとしています。x、yで機能するアルゴリズムはx、zでも機能するはずだと思います。

私のコード:

Vector3 thisPoint1 = thisCar.position + (2 * thisCar.forward);
Vector3 thisPoint2 = thisCar.position + (20 * thisCar.forward);

Debug.DrawLine(thisPoint1, thisPoint2, Color.white, 2);

Vector3 otherPoint1 = threateningCar.position + (2 * threateningCar.forward);
Vector3 otherPoint2 = threateningCar.position + (20 * threateningCar.forward);

Debug.DrawLine(otherPoint1, otherPoint2, Color.white, 2);

float A1 = thisPoint2.z - thisPoint1.z;
float B1 = thisPoint1.x - thisPoint2.x;
float C1 = A1 * thisPoint1.x + B1 * thisPoint1.z;

float A2 = otherPoint2.z - otherPoint1.z;
float B2 = otherPoint1.x - otherPoint2.x;
float C2 = A2 * otherPoint1.z + B2 * otherPoint1.z;

float det = A1 * B2 - A2 * B1;

float x = (B2 * C1 - B1 * C2) / det;
float z = (A1 * C2 - A2 * C1) / det;

return new Vector3(x, this.transform.position.y, z);

誰かが私が間違っていることを指摘するのを手伝ってもらえますか?

thisCar.forwardthreateningCar.forward通常は[0,0,1], [0,0,-1]または[1,0,0], [-1,0,0]

4

3 に答える 3

3

それを見つけた!!!

float A2 = otherPoint2.z - otherPoint1.z;
float B2 = otherPoint1.x - otherPoint2.x;
float C2 = A2 * otherPoint1.z + B2 * otherPoint1.z;

する必要があります:

float A2 = otherPoint2.z - otherPoint1.z;
float B2 = otherPoint1.x - otherPoint2.x; 

float C2 = A2 * otherPoint1.x + B2 * otherPoint1.z ;

無駄な時間はたくさんあります:/。

とにかく、これは線交差をしようとしている人を助けるでしょう。

于 2013-03-27T21:07:21.847 に答える
0

空のGameObjectを車の親にして、車の少し前に配置することができます(IDEまたは起動時のいずれか)。そうすれば、線を引くために必要な2つのポイントを安全に取得できます。

于 2013-03-27T10:45:48.273 に答える
0

tこの車と他の車が移動する必要がある距離を知っていればu、交点は取るに足らないものです。

Vector3 intersection = thisCar.position + (t * thisCar.forward);
Vector3 intersection = threateningCar.position + (u * threateningCar.forward);

ただし、いくつかの代数と、3D外積のスカラー値である2Dベクトル外積を解いて使用tすることはできます。u[x_1,z_1] × [x_2,z_1] = (x_2 z_1 - z_2 x_1)y

t = Vector3.Cross(threateningCar.forward, thisCar.position - threateningCar.position).y 
    / Vector3.Cross(thisCar.forward, threateningCar.forward).y;

u = Vector3.Cross(thisCar.forward, thisCar.position - threateningCar.position).y 
    / Vector3.Cross(thisCar.forward, threateningCar.forward).y;
于 2020-05-22T07:02:28.247 に答える