2010-11-22 10 views
5

necesito hacer un cubo con esquinas lisas y bordes lisos en C++ con OpenGL. por lo que sé, tengo tres opciones: curvas de Bezier (¿quizás, es posible?), Un cubo con cilindros para los bordes y esferas para las esquinas o carga un .3ds de un cubo.¿La mejor manera de dibujar un cubo con bordes suaves? Bezier Curve, carga un .3ds u otro?

¿Alguna idea?

+0

Ver esta pregunta en [hacer unos dados tienen bordes lisos] (http: //stackoverflow.com/q/3480161/59303) - específicamente mi respuesta. – ChrisF

+0

gracias, esto no apareció en mi búsqueda – QuantumKarl

+0

Cargando una .3ds no representa automáticamente una imagen para usted. Tienes que analizar los 3ds y renderizarlos tú mismo. La cuestión del rendering no tiene nada que ver con el formato de archivo. –

Respuesta

2

Puede simular un cubo con una iluminación suave apuntando las normales directamente desde el centro (simulando una esfera de 8 esquinas). Depende totalmente de qué es exactamente lo que estás tratando de hacer. Usar el método anterior puede ser lo suficientemente bueno.

Si quiere definir un cubo con esquinas curvas (de cerca), entonces tendrá que subdividir el cubo. De hecho, si subdivide fuertemente alrededor de las esquinas pero ignora las caras planas obtendrá un buen efecto.

Todo se reduce a pensar en cómo subdividir en los bordes. Piense en cómo se puede alisar hacia fuera y usted, sin duda, llegar a una solución bien :)

+0

el cubo en sí forma parte de una clase secundaria para representar un cubo de rubik, por lo que no necesita verse de cerca, pero debe ser bastante atractivo. ¿Un cubo detrás de otros cubos lo afectaría en absoluto? ¿Cuánto tiempo crees que esto llevaría aprender? Estoy bastante limitado por el tiempo – QuantumKarl

3

pseduocode:

mesh rounded_cube(int size, int edge_radius) 
{ 
    mesh result = sphere(edge_radius) 
    vertex octants[] = result.verteces() 
    for each v in octants 
    { 
     if (v.x != 0.0) 
      v.x = size * (v.x/abs(v.x)); 
     if (v.y != 0.0) 
      v.y = size * (v.y/abs(v.y)); 
     if (v.z != 0.0) 
      v.z = size * (v.z/abs(v.z)); 
    } 

    for i in result.vertices().size() 
    { 
     result.vertex[i] += octants[i] 
    } 

    return result; 

} 
+0

+1: si tuviera enuff rep :) – QuantumKarl

Cuestiones relacionadas