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.

C++ Raytracer: Cámara y Rayo

Estás traduciendo documentos de IT al español. Traduce lo siguiente al español. No traduzcas el código ni la salida en markdown.

Estoy programando un raytracer para la terminal de Linux en C++, primero decidí describir la esfera, aquí está la clase y el algoritmo:

class Sphere
{
public:
    float radius;
    vector3 center;

<pre><code>bool is_intersect(vector3 camera, vector3 ray)
{
    // vector from center to camera
    vector3 v = center - camera;

    // module of vector
    float abs_v = v.length();

    // ray must be normalized (in main)
    float pr_v_on_ray = ray.dot_product(v);

    float l2 = abs_v * abs_v - pr_v_on_ray * pr_v_on_ray;

    return l2 - radius * radius <= 0;
}
</code></pre>

};

<p><a href="https://i.stack.imgur.com/X0aXn.png">algoritmo</a></p>

<p>vector2 y vector3 son tipos escritos por mí para los vectores 2D y 3D con todas las operaciones de vectores estándar (como normalización, módulo, producto punto y otras).</p>

<p>Estoy creando una esfera con centro (0,0,0) y un radio y todo funciona:</p>

<p>“`
// porque los píxeles de la terminal no son cuadrados
float distorsión = (8,0 / 16) * (ancho / alto);

Sphere sphere = {0.5, vector3(0,0,0)};

for (int i = 0; i < ancho; ++i)
{
    for (int j = 0; j < alto; ++j)
    {
        vector2 xy = (vector2((float)i, (float)j) / vector2(ancho, alto)) 
            * vector2(2,2) - vector2(1,1); // x,y E [-1.0; 1.0]
        xy.x *= distorsión;

   vector3 camera = vector3(0,0,1);
   // rayo desde la cámara
   vector3 rayo = vector3(xy.x, xy.y, -1).normalize();

   if (sphere.is_intersect(camera, rayo)) mvaddch(j,i, &#39;@&#39;);

“`

resultado1-ok

Pero, cuando cambio las coordenadas del centro, aparece distorsión:


Sphere sphere = {0.5, vector3(-0.5,-0.5,0)};

resultado2-distorsión

  1. ¿Entiendo correctamente el algoritmo del rayo “disparado”? Si necesito “disparar” un rayo desde el punto (1,2,3) al punto (5,2,1), ¿entonces las coordenadas del rayo son (5-1,2-2,1-3) = (4,0,-2)?

Entiendo que ray.x y ray.y son todos los píxeles en la pantalla, pero ¿qué pasa con ray.z?

  1. No entiendo cómo funcionan las coordenadas de la cámara. (x,y,z) es un desplazamiento relativo al origen, y si cambio z, entonces cambia el tamaño de la proyección de la esfera, está bien, pero si cambio x o y, todo va mal. ¿Cómo puedo ver mi esfera desde todos los 6 lados? (Agregaré matrices de rotación si entiendo cómo funciona la cámara)

  2. ¿Qué provoca la distorsión al cambiar las coordenadas del centro de la esfera?

Mi objetivo final es la cámara que gira alrededor de la esfera. (Agregaré iluminación más tarde)

Lo siento por mi mal inglés, gracias por su paciencia.

Tags:  , , ,

Answer

  1. Avatar for davy.ai
    1. Sí, tienes razón. Para disparar un rayo desde el punto (1,2,3) hasta (5,2,1), la dirección del rayo sería (4,0,-2). La coordenada z del rayo representa la profundidad o distancia desde la cámara hacia el objeto que se está viendo.

    2. Las coordenadas de la cámara especifican la posición de la cámara en el espacio 3D. Cambiar los valores de x o y cambiará la posición de la cámara en relación con la esfera, lo que afectará la proyección de perspectiva de la esfera sobre la pantalla 2D. Si desea ver la esfera desde los 6 lados, puede usar una técnica llamada “cube mapping”, que implica renderizar la esfera en las caras de un cubo y luego aplicar el cubo como textura a una malla de cubo. Esto le permitirá ver la esfera desde todas las direcciones.

    3. La distorsión se debe a que las coordenadas x e y de los píxeles en la pantalla del terminal no son cuadradas. Para corregir esto, necesitas aplicar un factor de distorsión a la coordenada x. En tu código, estás multiplicando la coordenada x por el factor de distorsión, lo que debería corregir la distorsión. Sin embargo, cambiar las coordenadas del centro de la esfera afectará la distorsión ya que cambia la posición de la esfera en relación con la cámara.

Comments are closed.