web-dev-qa-db-ja.com

jupyter-cadquery(threejs)でウィジェットを埋め込む:ロード時の間違った位置

使ってます - jupyter-cadqueryCadQuery で作成されたいくつかの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

output

キューブのビューが相互作用で突然「ジャンプ」することに注意してください。

ipywidgetsの問題でしょうか?ノートに表示すると見やすいので大丈夫です。

どうすれば修正できますか?

再現する方法

ローカル環境を作成する必要なしに、バインダーでそれを再現できます(確かに、CadQuery/jupyter-cadqueryのインストールは、最も簡単で最速の方法ではありません)。

https://mybinder.org/v2/gh/bernhard-42/jupyter-cadquery/master?urlpath=lab&filepath=examples%2Fcadquery.ipynb

上記のコードを新しい空のノートブックで実行するだけです。ノートブックで問題なくrendererが3Dモデルを表示する方法をご覧ください。

Screenshot from 2019-12-23 21-28-42

実行後、export.htmlドキュメントは、左側のファイルリストにも表示されます。それを開き、ビューアの上部にある[Trust HTML]ボタンをクリックして、更新をクリックしてください。ビューを操作すると、問題を再現できます。

Screenshot from 2019-12-23 21-25-21

また、遠近法が失われることに注意してください(つまり、正射投影ビューではありません)。それを修正することはプラスです! ^^

8
Peque

これはjupyter-cadqueryがなくても再現できるため、代わりに新しい質問が開かれています。

pythreejsを使用した埋め込みウィジェット:間違ったパースペクティブとカメラのルックアット

0
Peque

数日かかりましたが、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()関数がないため、プログラムされたカメラ位置は手動干渉後のジャンプと見なされ、バグや間違いではありません。

0
ZF007