3D Rendering

OSL provides a powerful 3D rendering system for creating three-dimensional graphics and interactive environments.

Note: The 3D system only works on apps in fullscreen mode.

Setting Up the Environment

Initialize 3D Rendering

3dr "setup"  // Puts the window into fullscreen mode

Camera Setup

// Perspective projection
3dr "setup_perspective" fov min_distance max_distance

// Orthographic projection
3dr "setup_orthographic" min_distance max_distance

Mesh Management

Creating and Deleting Meshes

// Create a new mesh
mesh = newMesh()  // Returns a mesh ID

// Delete a mesh
mesh.meshDelete()

// Check if mesh exists
mesh.meshExists()  // Returns boolean

Mesh Data Operations

// Load mesh from OBJ format
3dr "set_mesh_to_obj" mesh obj_line_array

// Create 2D plane mesh
3dr "set_mesh_xy" mesh array_x array_y

// Create 3D mesh
3dr "set_mesh_xyz" mesh array_x array_y array_z

// Set mesh blending mode
3dr "set_mesh_blending" mesh mode
// Modes: "default", "additive", "subtractive", "multiply", "invert", "mask", "erase"

// Set mesh culling
3dr "set_mesh_culling" mesh mode
// Modes: "nothing", "back faces", "front faces"

Transformation and Rendering

Transform Operations

// Reset transformation matrix
3dr "reset_transform"

// Translate mesh
3dr "transform_xyz" x y z

// Scale mesh
3dr "scale_xyz" x y z  // Default: 1,1,1

// Draw mesh
3dr "draw_mesh" mesh

// Draw mesh at position
3dr "draw_mesh_at" mesh x y z

Space Management

// Switch to view space
3dr "to_view_space"

// Switch to world space
3dr "to_world_space"

// Transform from view to world space
3dr "transform_view_to_world" x y z

Mesh Properties

// Check mesh existence
mesh.meshExists()  // Returns boolean

// Check texture status
mesh.meshHasTexture()  // Returns boolean

Example: Interactive 3D Scene

// Setup 3D environment
3dr "setup"

// Camera position
cam_x = 0
cam_y = 3
cam_z = 0

// Create textured plane
plane = newMesh()
plane_x = [-1,1,-1,-1,1,1]
plane_y = [-1,-1,1,1,-1,1]
3dr "set_mesh_xy" plane plane_x plane_y

// Setup camera
3dr "setup_perspective" 90 0.01 1000

mainloop:
    // Camera rotation
    3dr "to_view_space"
    3dr "reset_transform"
    3dr "rotate" "x" 0 - mouse_y
    3dr "rotate" "y" 0 - mouse_x
    
    // Movement
    tx = ("a".pressed - "d".pressed) * delta_time * 20
    tz = ("w".pressed - "s".pressed) * delta_time * 20
    
    // Update camera position
    3dr "transform_view_to_world" tx 0 tz
    cam_x += 3drTransformX()
    cam_z += 3drTransformZ()
    
    // Render scene
    3dr "clear"
    3dr "to_world_space"
    3dr "reset_transform"
    3dr "draw_mesh" plane

Important Notes

  1. Performance Considerations

    • Minimize mesh updates during runtime

    • Use appropriate culling modes

    • Optimize texture sizes and formats

  2. Best Practices

    • Always check mesh existence before operations

    • Clean up unused meshes

    • Use delta_time for smooth animations

    • Handle fullscreen mode appropriately

  3. Limitations

    • Only works in fullscreen mode

    • Performance depends on browser capabilities

    • Mesh complexity affects rendering speed

  4. Camera Controls

    • Use mouse for rotation

    • WASD for movement

    • Consider adding smooth transitions

    • Implement collision detection if needed

Last updated

Was this helpful?