0

ワイヤをシミュレートするために、2 つの終点とドループ/サグの値を指定して放物線を描画するコードがあります。現在GL_LINE_STRIPを使用して描画していますが、ピクセルの太さに制限されており、ワールド座標の太さが必要です。だから私がする必要があるのは、厚さの半径を渡し、この放物線の各点で高さのセグメントを持つ円柱を描くことです。この座標系では +Y が上です。これが私のコードです:

const double pPrecision = 50;
double wx1, wy1, wz1, wx2, wy2, wz2, wx3, wy3, wz3;
double wa = gWires[i].Sag;
WorldToLocal(gWires[i].Lat1, gWires[i].Lon1, (gWires[i].El1 * FtToMtrs), &wx1, &wy1, &wz1);
WorldToLocal(gWires[i].Lat2, gWires[i].Lon2, (gWires[i].El2 * FtToMtrs), &wx3, &wy3, &wz3);

double mXZ = (wz3-wz1)/(wx3-wx1);
double mXY = (wy3-wy1)/(wx3-wx1);

wx2 = wx1 + ((wx3 - wx1) / 2.0);
wy2 = (mXY * (wx2 - wx1) + wy1) - wa;
wz2 = (mXZ * (wx2 - wx1) + wz1);

double denom = (wx1 - wx2) * (wx1 - wx3) * (wx2 - wx3);
double A = (wx3 * (wy2 - wy1) + wx2 * (wy1 - wy3) + wx1 * (wy3 - wy2)) / denom;
double B = (wx3*wx3 * (wy1 - wy2) + wx2*wx2 * (wy3 - wy1) + wx1*wx1 * (wy2 - wy3)) / denom;
double C = (wx2 * wx3 * (wx2 - wx3) * wy1 + wx3 * wx1 * (wx3 - wx1) * wy2 + wx1 * wx2 * (wx1 - wx2) * wy3) / denom;

double px = wx1;

//glLineWidth(gWires[i].Thickness);

glColor4f(gWires[i].R, gWires[i].G, gWires[i].B, 1.0f);
glBegin( GL_LINE_STRIP );
    for ( int p = 0; p <= pPrecision; ++p) {
        double thisZ = (mXZ * (px - wx1) + wz1);
        double thisY = (A * (px*px)) + (B * px) + C;
        glVertex3f(px, thisY, thisZ);
        px = px + ((wx3 - wx1) / pPrecision);
    }
glEnd();

ご覧のとおり、Lat/Long/El をローカルの opengl 座標に変換する WorldToLocal があります。

円柱の精度をセグメントあたり 6 つの頂点と仮定します...GL_TRIANGLE_STRIP プロット メソッドのために、これらの放物線の点を配列に追加し、それらを事前に計算して使用する必要があると考えています。円柱セグメントを右にプロットしながら次のセグメント シリンダーの端にキャップをする必要はありません。

4

0 に答える 0