una pierre online hacer graficar graficacion ejemplo curvas curva como caracteristicas bézier c++ math 3d

c++ - pierre - graficar curvas de bezier online



Mueve un objeto en la dirección de una curva Bezier? (4)

Tengo un objeto con el que me gustaría hacer seguir una curva bezier y ahora estoy un poco perdido en cuanto a cómo hacer eso en función del tiempo en lugar de los puntos que forman la curva.

. :: Sistema actual ::. Cada objeto en mi gráfico de escena está hecho de vectores de posición, rotación y escala. Estos vectores se utilizan para formar sus matrices correspondientes: escala, rotación y traducción. Que luego se multiplican en ese orden para formar la matriz de transformación local. Una transformación mundial (generalmente la matriz de identidad) se multiplica luego contra la transformación de matriz local.

class CObject { public: // Local transform functions Matrix4f GetLocalTransform() const; void SetPosition(const Vector3f& pos); void SetRotation(const Vector3f& rot); void SetScale(const Vector3f& scale); // Local transform Matrix4f m_local; Vector3f m_localPostion; Vector3f m_localRotation; // rotation in degrees (xrot, yrot, zrot) Vector3f m_localScale; } Matrix4f CObject::GetLocalTransform() { Matrix4f out(Matrix4f::IDENTITY); Matrix4f scale(), rotation(), translation(); scale.SetScale(m_localScale); rotation.SetRotationDegrees(m_localRotation); translation.SetTranslation(m_localTranslation); out = scale * rotation * translation; }

La gran pregunta que tengo es

1) ¿Cómo oriento mi objeto para enfrentar la tangente de la curva de Bezier?

2) ¿Cómo muevo ese objeto a lo largo de la curva sin solo colocar la posición de los objetos a la de un punto en el bezier cuve?

Aquí hay una descripción general de la función hasta el momento

void CNodeControllerPieceWise::AnimateNode(CObject* pSpatial, double deltaTime) { // Get object latest pos. Vector3f posDelta = pSpatial->GetWorldTransform().GetTranslation(); // Get postion on curve Vector3f pos = curve.GetPosition(m_t); // Get tangent of curve Vector3f tangent = curve.GetFirstDerivative(m_t); }

Editar: lo siento, no es muy claro. He estado trabajando en esto por años y está haciendo que mi cerebro se convierta en papilla.

Quiero que el objeto se una a la curva y que mire en la dirección de la curva.

En cuanto al movimiento, quiero oponerme a seguir la curva en función del tiempo, de esta manera se crea un movimiento suave a lo largo de la curva.


Necesita una formulación paramétrica de su curva.

La gran pregunta que tengo es

1) ¿Cómo oriento mi objeto para enfrentar la tangente de la curva de Bezier?

Si tiene la curva en forma paramétrica, la dirección tangencial es la derivada de la posición wrt. t .

2) ¿Cómo muevo ese objeto a lo largo de la curva sin solo colocar la posición de los objetos a la de un punto en el bezier cuve?

No estoy seguro de obtener su pregunta: aumentaría t en su forma paramétrica en un pequeño paso y actualizará la posición y dirección. Todavía tienes un grado de libertad allí, por cierto, la dirección de "arriba" no está determinada por la curva, por lo que tendrás que ocuparte de eso también.


Supongo que tiene todos los puntos que necesita para definir la curva Bezier. Entonces puedes calcular cada punto en esa curva. Calcule un punto adecuado teniendo en cuenta la velocidad a la que debe viajar el objeto, y el tiempo de cuadro y debe tener un movimiento consistente.

El vector formado por los puntos del último cuadro y el actual se puede usar como una estimación aproximada de la tangente en la mayoría de los casos; por ejemplo, cuando la curva no se dobla demasiado.

Editar: también eche un vistazo aquí sobre cómo calcular la longitud de una curva bezier . Tendrá que transformar eso, para que pueda calcular un punto en su curva (o más bien la t ) para una longitud determinada. Luego solo mueva las distancias equitativamente en relación con el tiempo y debería estar bien.


Un enfoque es calcular una pirámide de puntos. La capa inferior es tus puntos de control transformados. Ahora, para una t dada, y para cada par de puntos adyacentes, cree un nuevo punto que esté en este segmento de línea ponderado por t. Este nuevo conjunto de puntos forma la siguiente capa en la pirámide. Repita hasta que la capa actual tenga solo 1 punto. Este punto es tu posición. Tenga en cuenta que la segunda capa desde la parte superior tiene 2 puntos y determina la línea tangente.


Debería tener una curva en forma paramétrica y usar un vector derivado para evaluar la rotación de su objeto (ángulo de rotación = ángulo derivado) como dijo @etarion.

Para mover el objeto en una curva con la velocidad deseada (creo que es lo que piensas que quieres), cada paso de simulación debes estimar la distancia que debe recorrer el punto en este paso.

La estimación más simple es dist = derivative.length()*TIMER_STEP . Cuando sepa que el dist debe atravesarse en el paso actual y t0 - el parámetro actual de la curva, puede simplemente aumentar t0 en un pequeño valor epsilon y verificar que la distancia recorrida sea aún menor que la estimada. Repita esto hasta que la distancia recorrida (mientras aumenta t0) sea> = estimada. Este será el nuevo parámetro actual t0 para el próximo paso

EDITAR:

No me di cuenta primero que estás en 3d. En el espacio 3D no se puede definir inequívocamente la posición de un objeto en una curva, incluso si conoce la posición inicial. Solo imagine que su curva es una línea, el objeto aún puede rotar alrededor de la línea. Este ángulo no está definido por una curva.

Haría algo así. Atemos un vector al objeto para que al comienzo del movimiento (parámetro de curva t = 0 por ejemplo) la dirección del vector del objeto coincida con el vector derivado. Luego, durante el movimiento, este vector debería coincidir con la derivada en cada punto de una curva. Entonces conocerá este vector de objeto y podrá configurar su objeto de acuerdo con este vector. Pero aún tendrás un grado de libertad.

Por ejemplo, puede decir que el objeto no gira alrededor de este vector.

Conociendo el vector objeto y el ángulo de rotación a su alrededor, puede restaurar la orientación del objeto en el mundo 3D.

PD: este vector de objetos y un ángulo de rotación se llaman cuaterniones, por lo que puede usar cuaterniones matemáticas (¡copie simplemente la fórmula requerida) para calcular la matriz de rotación de objetos! aquí están las fórmulas http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToMatrix/index.htm