Compare commits
2 Commits
d9f2d358a1
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
ff07f7052f
|
|||
|
1c4498653e
|
32
main.py
32
main.py
@ -6,13 +6,13 @@ from math import cos, sin
|
|||||||
from typing import cast
|
from typing import cast
|
||||||
import dearpygui.dearpygui as dpg # pyright: ignore[reportMissingTypeStubs]
|
import dearpygui.dearpygui as dpg # pyright: ignore[reportMissingTypeStubs]
|
||||||
|
|
||||||
RENDER_VERTICES = False
|
RENDER_VERTICES = True
|
||||||
RENDER_EDGES = True
|
RENDER_EDGES = True
|
||||||
BEST_EFFORT_PARSE = True
|
BEST_EFFORT_PARSE = True
|
||||||
|
|
||||||
CANVAS_SIZE = 500
|
CANVAS_SIZE = 500
|
||||||
TIMESTEP = 0.01
|
TIMESTEP = 0.01
|
||||||
CAMERA_DISTANCE = 3.0
|
CAMERA_DISTANCE = 2.5
|
||||||
|
|
||||||
VERTEX_SIZE = 5.0
|
VERTEX_SIZE = 5.0
|
||||||
VERTEX_COLOR = (27, 188, 104)
|
VERTEX_COLOR = (27, 188, 104)
|
||||||
@ -31,6 +31,8 @@ IndexedFaceSet = list[IndexedFace]
|
|||||||
|
|
||||||
|
|
||||||
def to_viewport(verts: Vertex2Set) -> Vertex2Set:
|
def to_viewport(verts: Vertex2Set) -> Vertex2Set:
|
||||||
|
"""Maps vertices into the [0, WIDTH]x[0, HEIGHT] viewport"""
|
||||||
|
|
||||||
def transform(vert: Vertex2) -> Vertex2:
|
def transform(vert: Vertex2) -> Vertex2:
|
||||||
return (
|
return (
|
||||||
((vert[0] + 1.0) / 2.0) * CANVAS_SIZE,
|
((vert[0] + 1.0) / 2.0) * CANVAS_SIZE,
|
||||||
@ -41,6 +43,8 @@ def to_viewport(verts: Vertex2Set) -> Vertex2Set:
|
|||||||
|
|
||||||
|
|
||||||
def to_imageplane(verts: Vertex3Set) -> Vertex2Set:
|
def to_imageplane(verts: Vertex3Set) -> Vertex2Set:
|
||||||
|
"""Projects vertices onto the [-1, 1]x[-1, 1] imageplane"""
|
||||||
|
|
||||||
def transform(vert: Vertex3) -> Vertex2:
|
def transform(vert: Vertex3) -> Vertex2:
|
||||||
return (vert[0] / vert[2], vert[1] / vert[2])
|
return (vert[0] / vert[2], vert[1] / vert[2])
|
||||||
|
|
||||||
@ -48,6 +52,8 @@ def to_imageplane(verts: Vertex3Set) -> Vertex2Set:
|
|||||||
|
|
||||||
|
|
||||||
def translate(verts: Vertex3Set, distance: float) -> Vertex3Set:
|
def translate(verts: Vertex3Set, distance: float) -> Vertex3Set:
|
||||||
|
"""Translates vertices along the forward-axis in 3D space"""
|
||||||
|
|
||||||
def transform(vert: Vertex3) -> Vertex3:
|
def transform(vert: Vertex3) -> Vertex3:
|
||||||
return (vert[0], vert[1], vert[2] + distance)
|
return (vert[0], vert[1], vert[2] + distance)
|
||||||
|
|
||||||
@ -55,6 +61,8 @@ def translate(verts: Vertex3Set, distance: float) -> Vertex3Set:
|
|||||||
|
|
||||||
|
|
||||||
def rotate(verts: Vertex3Set, angle: float) -> Vertex3Set:
|
def rotate(verts: Vertex3Set, angle: float) -> Vertex3Set:
|
||||||
|
"""Rotates vertices around the up-axis in 3D space"""
|
||||||
|
|
||||||
def transform(vert: Vertex3) -> Vertex3:
|
def transform(vert: Vertex3) -> Vertex3:
|
||||||
return (
|
return (
|
||||||
vert[0] * cos(angle) - vert[2] * sin(angle),
|
vert[0] * cos(angle) - vert[2] * sin(angle),
|
||||||
@ -86,9 +94,10 @@ def draw(drawlist, vertices: Vertex3Set, faces: IndexedFaceSet, time: float):
|
|||||||
thickness=EDGE_SIZE,
|
thickness=EDGE_SIZE,
|
||||||
)
|
)
|
||||||
|
|
||||||
viewport_vertices: Vertex2Set = to_viewport(
|
rotated_vertices: Vertex3Set = rotate(vertices, time)
|
||||||
to_imageplane(translate(rotate(vertices, time), CAMERA_DISTANCE))
|
translated_vertices: Vertex3Set = translate(rotated_vertices, CAMERA_DISTANCE)
|
||||||
)
|
imageplane_vertices: Vertex2Set = to_imageplane(translated_vertices)
|
||||||
|
viewport_vertices: Vertex2Set = to_viewport(imageplane_vertices)
|
||||||
|
|
||||||
if RENDER_VERTICES:
|
if RENDER_VERTICES:
|
||||||
for v in viewport_vertices:
|
for v in viewport_vertices:
|
||||||
@ -147,9 +156,22 @@ def parse_obj_file(path: str) -> tuple[Vertex3Set, IndexedFaceSet]:
|
|||||||
def main():
|
def main():
|
||||||
parser = argparse.ArgumentParser()
|
parser = argparse.ArgumentParser()
|
||||||
_ = parser.add_argument("objfile", type=str, help=".obj file to render")
|
_ = parser.add_argument("objfile", type=str, help=".obj file to render")
|
||||||
|
_ = parser.add_argument("--vertices", action="store_true", help="render vertices")
|
||||||
|
_ = parser.add_argument("--edges", action="store_true", help="render edges")
|
||||||
|
_ = parser.add_argument(
|
||||||
|
"--strict", action="store_true", help="require complete parsing of .obj file"
|
||||||
|
)
|
||||||
args = parser.parse_args()
|
args = parser.parse_args()
|
||||||
args.objfile = cast(str, args.objfile)
|
args.objfile = cast(str, args.objfile)
|
||||||
|
|
||||||
|
global RENDER_VERTICES
|
||||||
|
global RENDER_EDGES
|
||||||
|
global BEST_EFFORT_PARSE
|
||||||
|
|
||||||
|
RENDER_VERTICES = bool(args.vertices)
|
||||||
|
RENDER_EDGES = bool(args.edges)
|
||||||
|
BEST_EFFORT_PARSE = not bool(args.strict)
|
||||||
|
|
||||||
dpg.create_context()
|
dpg.create_context()
|
||||||
|
|
||||||
with dpg.theme() as canvas_theme, dpg.theme_component():
|
with dpg.theme() as canvas_theme, dpg.theme_component():
|
||||||
|
|||||||
Reference in New Issue
Block a user