Skip to content

Commit ba110bd

Browse files
committed
updated dependencies
1 parent 71f4b75 commit ba110bd

12 files changed

+151
-113
lines changed

02_mesh_primitive.py

+1
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ def draw_mesh(tri2vtx, vtx2xyz):
2121

2222

2323
if __name__ == "__main__":
24+
draw_mesh(*TriMesh.hemisphere(radius=1.0, ndiv_longtitude=8))
2425
draw_mesh(*TriMesh.torus(major_radius=0.4, minor_radius=0.2))
2526
draw_mesh(*TriMesh.capsule(radius=0.1, height=1.2, ndiv_longtitude=8))
2627
draw_mesh(*TriMesh.cylinder(radius=0.3, height=1.2))

07_direct_manipulation_delta_blendshape.py

+3-4
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
11
from pathlib import Path
22
import moderngl
33
import numpy
4-
import blendshape_delta
54
from PyQt5 import QtWidgets, QtCore
65
from pyrr import Matrix44
76
from util_moderngl_qt import DrawerMesh, QGLWidgetViewer3
87
from util_moderngl_qt.drawer_transform_multi import DrawerTransformMulti
9-
from del_msh import WavefrontObj, TriMesh, PolygonMesh
8+
from del_msh import WavefrontObj, TriMesh, PolygonMesh, BlendShape
109

1110

1211
class MainWindow(QtWidgets.QMainWindow):
@@ -94,7 +93,7 @@ def mouse_move_callback(self, event):
9493
mvp = numpy.array(mvp).transpose()
9594
trg = (self.glwidget.nav.cursor_x, self.glwidget.nav.cursor_y)
9695
self.markers[self.vtx_pick] = [mvp, trg]
97-
dweights = blendshape_delta.direct_manipulation(self.shape2pos, self.markers)
96+
dweights = BlendShape.direct_manipulation_delta(self.shape2pos, self.markers)
9897
print(dweights)
9998
self.weights = numpy.append(1 - numpy.sum(dweights), dweights).astype(numpy.float32)
10099
vtx2xyz = self.weights.transpose().dot(self.shape2pos).reshape(-1, 3).copy()
@@ -119,7 +118,7 @@ def mouse_doubleclick_callback(self, event):
119118
if len < self.rad_sphere:
120119
self.markers.pop(vtx)
121120
self.vtx_pick = -1
122-
dweights = blendshape_delta.direct_manipulation(self.shape2pos, self.markers)
121+
dweights = BlendShape.direct_manipulation_delta(self.shape2pos, self.markers)
123122
self.weights = numpy.append(1 - numpy.sum(dweights), dweights).astype(numpy.float32)
124123
vtx2xyz = self.weights.transpose().dot(self.shape2pos).reshape(-1, 3).copy()
125124
self.drawer_mesh.update_position(vtx2xyz)

08_direct_manipulation_absolute_blendshape.py

+3-4
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
11
from pathlib import Path
22
import moderngl
33
import numpy
4-
import blendshape_absolute
54
from PyQt5 import QtWidgets, QtCore
65
from pyrr import Matrix44
76
from util_moderngl_qt import DrawerMesh, QGLWidgetViewer3
87
from util_moderngl_qt.drawer_transform_multi import DrawerTransformMulti
9-
from del_msh import WavefrontObj, PolygonMesh, TriMesh
8+
from del_msh import WavefrontObj, PolygonMesh, TriMesh, BlendShape
109

1110

1211
class MainWindow(QtWidgets.QMainWindow):
@@ -94,7 +93,7 @@ def mouse_move_callback(self, event):
9493
mvp = numpy.array(mvp).transpose()
9594
trg = (self.glwidget.nav.cursor_x, self.glwidget.nav.cursor_y)
9695
self.markers[self.vtx_pick] = [mvp, trg]
97-
self.weights = blendshape_absolute.direct_manipulation(self.shape2pos, self.markers)
96+
self.weights = BlendShape.direct_manipulation_absolute(self.shape2pos, self.markers)
9897
vtx2xyz = self.weights.transpose().dot(self.shape2pos).reshape(-1, 3).copy()
9998
self.drawer_mesh.update_position(vtx2xyz)
10099
rad = self.glwidget.nav.view_height / self.glwidget.nav.scale * 0.03
@@ -116,7 +115,7 @@ def mouse_doubleclick_callback(self, event):
116115
return
117116
self.markers.pop(vtx_pick)
118117
self.vtx_pick = -1
119-
self.weights = blendshape_absolute.direct_manipulation(self.shape2pos, self.markers)
118+
self.weights = BlendShape.direct_manipulation_absolute(self.shape2pos, self.markers)
120119
vtx2xyz = self.weights.transpose().dot(self.shape2pos).reshape(-1, 3).copy()
121120
self.drawer_mesh.update_position(vtx2xyz)
122121
rad = self.glwidget.nav.view_height / self.glwidget.nav.scale * 0.03

09_tri_select.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ def __init__(self):
2828
self.cur_dist = -1
2929
self.tri2dist = numpy.zeros(self.tri2vtx.shape[0], dtype=numpy.uint64)
3030
self.tri2flag = numpy.zeros(self.tri2vtx.shape[0], dtype=numpy.int32)
31-
self.tri2tri = TriMesh.triangle_adjacency(self.tri2vtx, self.vtx2xyz.shape[0])
31+
self.tri2tri = TriMesh.tri2tri(self.tri2vtx, self.vtx2xyz.shape[0])
3232

3333
super().__init__()
3434
self.resize(640, 480)
@@ -57,7 +57,7 @@ def mouse_press_callback(self, event):
5757
self.tri2flag[tri_index] = 1
5858
self.cur_dist = -1
5959
self.update_visualization(True)
60-
self.tri2dist = TriMesh.topological_distance_of_tris(tri_index, self.tri2tri)
60+
self.tri2dist = TriMesh.tri2distance(tri_index, self.tri2tri)
6161

6262
def mouse_move_callback(self, event: QtGui.QMouseEvent) -> None:
6363
if event.modifiers() & QtCore.Qt.KeyboardModifier.ShiftModifier:

10_sampling_mesh.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111

1212

1313
def sample_mesh_uniform(tri2vtx, vtx2xyz):
14-
tri2area = TriMesh.areas(tri2vtx, vtx2xyz)
14+
tri2area = TriMesh.tri2area(tri2vtx, vtx2xyz)
1515
cumsum_area = numpy.cumsum(numpy.append(0., tri2area)).astype(numpy.float32)
1616

1717
rad = 0.1

13_kdtree2.py

+5-6
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,14 @@
11
from PyQt5 import QtWidgets
22
from util_moderngl_qt import DrawerMeshUnindex, QGLWidgetViewer3
33
import numpy
4-
from del_msh.del_msh import MyClass
5-
4+
from del_msh import KdTree
65

76
def main():
8-
coord = numpy.random.rand(100, 2).astype(numpy.float32)
7+
coord = numpy.random.rand(1000, 2).astype(numpy.float64)
98
coord[:, :] *= 1.8
10-
coord[:, :] -= 09.
11-
kdtree2 = MyClass(coord)
12-
edges = kdtree2.edges()
9+
coord[:, :] -= 0.9
10+
kdtree = KdTree.build_topology(coord)
11+
edges = KdTree.build_edge(kdtree, coord)
1312
print(edges.shape)
1413

1514
with QtWidgets.QApplication([]) as app:

19_meshing.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -23,4 +23,4 @@
2323
ax.set_aspect('equal')
2424
ax.scatter(xys[:, 0], xys[:, 1])
2525
ax.add_patch(matplotlib.patches.Polygon(xy=vtx2xy_in, closed=True, fill=False))
26-
plt.show()
26+
plt.show()

20_deform_mls.py

+84
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
import pathlib
2+
import math
3+
import numpy
4+
import time
5+
import moderngl
6+
import pyrr
7+
from PyQt5 import QtWidgets
8+
from PyQt5.QtCore import QTimer
9+
10+
from util_moderngl_qt import DrawerMesh, QGLWidgetViewer3
11+
from util_moderngl_qt.drawer_transform_multi import DrawerTransformMulti
12+
from del_msh import TriMesh, DeformMLS
13+
14+
15+
class MainWindow(QtWidgets.QMainWindow):
16+
17+
def __init__(self):
18+
path_file = pathlib.Path('.') / 'asset' / 'bunny_1k.obj'
19+
self.tri2vtx, self.vtx2xyz = TriMesh.load_wavefront_obj(str(path_file), is_centerize=True, normalized_size=1.)
20+
self.vtx2xyz_new = self.vtx2xyz.copy()
21+
print(self.vtx2xyz_new.strides, self.vtx2xyz_new.dtype)
22+
self.samples_old = numpy.array([
23+
(-0.3, -0.3, -0.3),
24+
(+0.3, -0.3, -0.3),
25+
(-0.3, +0.3, -0.3),
26+
(-0.3, -0.3, +0.3),
27+
(-0.3, +0.3, +0.3)], dtype=numpy.float32)
28+
self.weights = DeformMLS.kernel(self.samples_old, self.vtx2xyz)
29+
self.mls_data = DeformMLS.precomp(self.samples_old, self.vtx2xyz, self.weights)
30+
self.samples_new = self.samples_old.copy()
31+
32+
edge2vtx = TriMesh.edge2vtx(self.tri2vtx, self.vtx2xyz.shape[0])
33+
self.drawer_edge = DrawerMesh.Drawer(
34+
vtx2xyz=self.vtx2xyz,
35+
list_elem2vtx=[
36+
DrawerMesh.ElementInfo(index=edge2vtx, color=(0, 0, 0), mode=moderngl.LINES),
37+
DrawerMesh.ElementInfo(index=self.tri2vtx, color=(1, 1, 1), mode=moderngl.TRIANGLES)
38+
]
39+
)
40+
41+
sphere_tri2vtx, sphere_vtx2xyz = TriMesh.sphere()
42+
self.drawer_sphere = DrawerMesh.Drawer(vtx2xyz=sphere_vtx2xyz, list_elem2vtx=[
43+
DrawerMesh.ElementInfo(index=sphere_tri2vtx, color=(1., 0., 0.), mode=moderngl.TRIANGLES)])
44+
self.drawer_sphere = DrawerTransformMulti(self.drawer_sphere)
45+
for sample in self.samples_old:
46+
scale = pyrr.Matrix44.from_scale((0.01, 0.01, 0.01))
47+
translation = pyrr.Matrix44.from_translation(sample)
48+
self.drawer_sphere.list_transform.append(translation * scale)
49+
50+
super().__init__()
51+
self.resize(640, 480)
52+
self.setWindowTitle('Mesh Viewer')
53+
self.glwidget = QGLWidgetViewer3.QtGLWidget_Viewer3(
54+
[self.drawer_edge, self.drawer_sphere])
55+
self.setCentralWidget(self.glwidget)
56+
#
57+
self.timer = QTimer()
58+
self.timer.setInterval(30)
59+
self.timer.timeout.connect(self.step_time)
60+
self.timer.start()
61+
62+
def step_time(self):
63+
# self.time += self.timer.interval() * 1.0e-3
64+
self.samples_new = self.samples_old.copy()
65+
self.samples_new[0, 0] += -0.5 + 0.4 * math.sin(time.time() * 2.0)
66+
self.vtx2xyz_new = self.mls_data.dot(self.samples_new)
67+
#
68+
self.drawer_edge.update_position(self.vtx2xyz_new)
69+
for i_sample in range(self.samples_new.shape[0]):
70+
scale = pyrr.Matrix44.from_scale((0.03, 0.03, 0.03))
71+
translation = pyrr.Matrix44.from_translation(self.samples_new[i_sample])
72+
self.drawer_sphere.list_transform[i_sample] = translation * scale
73+
self.glwidget.update()
74+
75+
76+
def main():
77+
with QtWidgets.QApplication([]) as app:
78+
win = MainWindow()
79+
win.show()
80+
app.exec()
81+
82+
83+
if __name__ == "__main__":
84+
main()

21_bvh.py

+35
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import pathlib
2+
3+
import del_msh.BVH
4+
import moderngl
5+
from PyQt5 import QtWidgets
6+
7+
from util_moderngl_qt import DrawerMesh, DrawerMeshUnindex, QGLWidgetViewer3
8+
from del_msh import TriMesh
9+
10+
11+
def main():
12+
path_file = pathlib.Path('.') / 'asset' / 'bunny_1k.obj'
13+
tri2vtx, vtx2xyz = TriMesh.load_wavefront_obj(str(path_file), is_centerize=True, normalized_size=1.)
14+
bvh, aabb = TriMesh.bvh_aabb(tri2vtx, vtx2xyz)
15+
#
16+
edge2vtx = TriMesh.edge2vtx(tri2vtx, vtx2xyz.shape[0])
17+
drawer_mesh = DrawerMesh.Drawer(
18+
vtx2xyz=vtx2xyz,
19+
list_elem2vtx=[
20+
DrawerMesh.ElementInfo(index=edge2vtx, color=(0, 0, 0), mode=moderngl.LINES),
21+
DrawerMesh.ElementInfo(index=tri2vtx, color=(1, 1, 0), mode=moderngl.TRIANGLES)
22+
]
23+
)
24+
#
25+
aabb_edges = del_msh.BVH.edges_of_aabb(aabb)
26+
drawer_aabb = DrawerMeshUnindex.Drawer(elem2node2xyz=aabb_edges)
27+
#
28+
with QtWidgets.QApplication([]) as app:
29+
glwidget = QGLWidgetViewer3.QtGLWidget_Viewer3([drawer_mesh, drawer_aabb])
30+
glwidget.show()
31+
app.exec()
32+
33+
34+
if __name__ == "__main__":
35+
main()

blendshape_absolute.py

-35
This file was deleted.

blendshape_delta.py

-49
This file was deleted.

requirements.txt

+16-11
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,22 @@
1-
cvxopt==1.3.0
2-
glcontext==2.3.6
1+
contourpy==1.2.0
2+
cvxopt==1.3.2
3+
cycler==0.12.1
4+
-e git+https://github.com/nobuyuki83/pydel-ls.git@88928318164a5e70c96747127adb85154e8e2d88#egg=del_ls
5+
-e git+https://github.com/nobuyuki83/pydel-msh.git@17f9c11e3edce6f58fc0c3c6f58346dcf95f7628#egg=del_msh
6+
fonttools==4.45.0
7+
glcontext==2.5.0
8+
kiwisolver==1.4.5
9+
matplotlib==3.8.2
310
moderngl==5.8.2
4-
multipledispatch==0.6.0
5-
numpy==1.23.4
6-
Pillow==9.4.0
11+
multipledispatch==1.0.0
12+
numpy==1.26.2
13+
packaging==23.2
14+
Pillow==10.1.0
15+
pyparsing==3.1.1
716
PyQt5==5.15.9
817
PyQt5-Qt5==5.15.2
918
PyQt5-sip==12.11.1
10-
PyQt5-stubs==5.15.6.0
1119
pyrr==0.10.3
20+
python-dateutil==2.8.2
1221
six==1.16.0
13-
style==1.1.0
14-
update==0.0.1
15-
util-moderngl-qt==0.1.19
16-
del-msh==0.1.16
17-
del-ls==0.1.0
22+
-e git+https://github.com/nobuyuki83/pyutil_moderngl_qt.git@08d52a5fa39b2b5d716d445e434b9250dc29ac4a#egg=util_moderngl_qt

0 commit comments

Comments
 (0)