使ってます - jupyter-cadquery
CadQuery で作成されたいくつかの3Dモデルを視覚化します。
Jupyterノートブックでモデルを視覚化すると、すべてが期待どおりに機能します。
しかし、ウィジェットをHTMLドキュメントに埋め込もうとすると、ロード時にカメラが(0, 0, 0)
、期待どおりではありません。ウィジェットを操作すると、カメラは予想される座標を指します。
エラーと上記の問題のアニメーションを再現するコードは次のとおりです(Binderを使用して再現する方法については、以下の手順を参照してください)。
from cadquery import Workplane
from ipywidgets import embed
from jupyter_cadquery.cad_view import CadqueryView
from jupyter_cadquery.cadquery import Assembly
from jupyter_cadquery.cadquery import Part
# Create a simple Assembly
box1 = Workplane('XY').box(10, 10, 10).translate((0, 0, 5))
a1 = Assembly([Part(box1)], "example 1")
# Generate HTML
a1.collect_shapes()
view = CadqueryView()
for shape in a1.collect_shapes():
view.add_shape(shape["name"], shape["shape"], shape["color"])
renderer = view.render()
embed.embed_minimal_html('export.html', views=renderer, title='Renderer')
renderer
キューブのビューが相互作用で突然「ジャンプ」することに注意してください。
ipywidgets
の問題でしょうか?ノートに表示すると見やすいので大丈夫です。
どうすれば修正できますか?
ローカル環境を作成する必要なしに、バインダーでそれを再現できます(確かに、CadQuery/jupyter-cadqueryのインストールは、最も簡単で最速の方法ではありません)。
上記のコードを新しい空のノートブックで実行するだけです。ノートブックで問題なくrenderer
が3Dモデルを表示する方法をご覧ください。
実行後、export.html
ドキュメントは、左側のファイルリストにも表示されます。それを開き、ビューアの上部にある[Trust HTML]ボタンをクリックして、更新をクリックしてください。ビューを操作すると、問題を再現できます。
また、遠近法が失われることに注意してください(つまり、正射投影ビューではありません)。それを修正することはプラスです! ^^
これはjupyter-cadquery
がなくても再現できるため、代わりに新しい質問が開かれています。
数日かかりましたが、cadqueryが適切に機能しませんでしたが、cadqueryを使用せずにこのトピックについて 2番目の質問 を使用すると、問題を確認できました...
ジャンプは、ターゲットのorbit.update()
が発生せず、関数update()
がPythonで使用できないために発生します。 c ++またはc#などでのみ。ドキュメントから:
上記のカメラの回転をアニメーション化するときは、カメラのクォータニオンを使用しました。これは、自由形式の回転をアニメーション化するための最も堅牢な方法です。たとえば、上記のアニメーションは、最初にカメラを手動で移動し、次に目的のビューでその位置とクォータニオンプロパティを読み取ることによって作成されました...
このテキストは、12ページの here にあります。また、githubで here についても説明しています。
ただし、以下を適用すると、IPythonでジャンプを再現できます。
renderer = Renderer(scene=scene, camera=camera, controls=[orbit], position=target, width=view_width, height=view_height)
ここでposition
はターゲット座標[0、5、0]で追加されますが、これの更新は、マウスクリックしてキューブ/カメラの位置に調整したときにのみ行われます。ジャンプは、export.HTMLに見られるジャンプと同様/同等です。
結論:OrbitControls pythonクラスの.update()
関数がないため、プログラムされたカメラ位置は手動干渉後のジャンプと見なされ、バグや間違いではありません。