float4x4.PerspectiveOffCenter(): possible logic flaw?

Aperta
#247 0 commenti 0 reazioni 0 assegnatari Vedi su GitHub

Nessuno ha ancora preso questa issue.

Valutazione

Difficoltà
4/5
Tempo stimato
3-5 giorni
Idoneità per principianti
45/100
Tipo di issue
Bug
Chiarezza
Abbastanza chiara
Stato di attività
Ferma
Stack tecnologico
csharp, unity

Direzione di ricerca

Inizia in src/Unity.Mathematics/matrix.cs da PerspectiveOffCenter() e confronta la disposizione della relativa matrice con l’implementazione System.Numerics collegata. Verifica la trasposizione e le convenzioni delle coordinate descritte nell’issue, quindi conferma se i valori diversi M33/M34 o M43 costituiscono un errore logico; il lavoro è completato quando il comportamento è risolto e l’implementazione o la spiegazione corrisponde alla convenzione prevista.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

The Unity.Mathematics implementation of PerspectiveOffCenter() Link

public static float4x4 PerspectiveOffCenter(float left, float right, float bottom, float top, float near, float far)
{
    float rcpdz = 1.0f / (near - far);
    float rcpWidth = 1.0f / (right - left);
    float rcpHeight = 1.0f / (top - bottom);

    return float4x4(
        2.0f * near * rcpWidth,     0.0f,                       (left + right) * rcpWidth,     0.0f,
        0.0f,                       2.0f * near * rcpHeight,    (bottom + top) * rcpHeight,    0.0f,
        0.0f,                       0.0f,                        **(far + near) * rcpdz**,          **2.0f * near * far * rcpdz**,
        0.0f,                       0.0f,                       -1.0f,                          0.0f
        );
}

differs from the .NET System.Numerics.Matrix4x4 implementation:

public static Matrix4x4 CreatePerspectiveOffCenter(float left, float right, float bottom, float top, float nearPlaneDistance, float farPlaneDistance)
{
    if (nearPlaneDistance <= 0.0f)
        throw new ArgumentOutOfRangeException("nearPlaneDistance");

    if (farPlaneDistance <= 0.0f)
        throw new ArgumentOutOfRangeException("farPlaneDistance");

    if (nearPlaneDistance >= farPlaneDistance)
        throw new ArgumentOutOfRangeException("nearPlaneDistance");

    Matrix4x4 result;

    result.M11 = 2.0f * nearPlaneDistance / (right - left);
    result.M12 = result.M13 = result.M14 = 0.0f;

    result.M22 = 2.0f * nearPlaneDistance / (top - bottom);
    result.M21 = result.M23 = result.M24 = 0.0f;

    result.M31 = (left + right) / (right - left);
    result.M32 = (top + bottom) / (top - bottom);
    // below is different
    **result.M33 = farPlaneDistance / (nearPlaneDistance - farPlaneDistance);**
    result.M34 = -1.0f;
    // below is different
    **result.M43 = nearPlaneDistance * farPlaneDistance / (nearPlaneDistance - farPlaneDistance);**
    result.M41 = result.M42 = result.M44 = 0.0f;

    return result;
}

In Unity M33 is:
(far + near) * rcpdz
while System M33 is:
result.M33 = farPlaneDistance / (nearPlaneDistance - farPlaneDistance);

In Unity M34 is:
2.0f * near * far * rcpdz
while System M43 is:
result.M43 = nearPlaneDistance * farPlaneDistance / (nearPlaneDistance - farPlaneDistance);

Note that both matrices are transposed to each other; System Matrix can be thought of as rotating the coordinate system itself while Unity Matrix rotates the given vector.

Lingua principale
C#
Stelle
1.4k
Fork
159
Metriche di merge delle PR
Nessuna PR unita negli ultimi 30g

Guida per i contributori

Nessuna guida per i contributori indicizzata per questo repository

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di Unity-Technologies/Unity.Mathematics

Tutte le issue di Unity-Technologies/Unity.Mathematics

Issue simili

Altre issue su C#

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.