es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

No puedo entender completamente el Método de Diferencias Finitas.

Soy un estudiante que estudia DirectX 11. Para calcular el vector normal de la superficie, sé que necesito obtener dos vectores tangentes para calcular el producto cruzado. Pero puedo hacerlo si existe la ecuación de la superficie.

Si no conozco la ecuación/fórmula de la superficie, tengo que obtener la aproximación del vector normal utilizando el Método de Diferencias Finitas. El siguiente código es del libro que estoy leyendo.

for(UINT i = 1; i < mNumRows-1; ++i)
{
    for(UINT j = 1; j < mNumCols-1; ++j)
    {
        float l = mCurrSolution[i*mNumCols+j-1].y;
        float r = mCurrSolution[i*mNumCols+j+1].y;
        float t = mCurrSolution[(i-1)*mNumCols+j].y;
        float b = mCurrSolution[(i+1)*mNumCols+j].y;
        mNormals[i*mNumCols+j].x = -r+l;
        mNormals[i*mNumCols+j].y = 2.0f*mSpatialStep;
        mNormals[i*mNumCols+j].z = b-t;

        XMVECTOR n = XMVector3Normalize(XMLoadFloat3(&mNormals[i*mNumCols+j]));
        XMStoreFloat3(&mNormals[i*mNumCols+j], n);
    }
}

No entiendo por qué los valores -r+l y b-t (la diferencia de los valores de y) se convierten en el valor de x y el valor de z del vector normal, respectivamente. Me pregunto por qué 2.0f * mSpatialStep es el valor de y también.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Como experto en IT especializado en gráficos DirectX 11 y análisis numérico, puedo explicar que este código utiliza el Método de Diferencias Finitas para aproximar el vector normal de una superficie. Este método implica usar las diferencias en los valores de altura de la superficie en puntos cercanos para estimar el gradiente de la superficie, que luego se puede utilizar para calcular el vector normal.

    En este código, los valores “-r+l” y “b-t” representan las diferencias en los valores de y de puntos vecinos en la superficie, que proporcionan información sobre el gradiente de la superficie en las direcciones x y z, respectivamente. Dividir estas diferencias por el tamaño del paso en cada dirección (que es “mSpatialStep” en este caso) produce una estimación de la derivada parcial de la superficie en cada dirección, y tomar el producto cruzado de estas derivadas parciales da como resultado el vector normal de la superficie en ese punto.

    En cuanto a por qué se utiliza “2.0f * mSpatialStep” como valor de y, esto es probablemente porque representa la distancia entre puntos vecinos en la dirección y. Como los valores de altura de la superficie se almacenan en una cuadrícula, el tamaño del paso en cada dirección es el mismo, por lo que este valor se puede utilizar para estimar el gradiente en la dirección y también. Sin embargo, cabe señalar que esto es solo una aproximación, y se pueden obtener mejores resultados utilizando métodos más precisos como el análisis de elementos finitos.

Comments are closed.