https://linen.dev logo
renderPartRotateで回転しているオブジェクトのある任意の地点の動的な座標を取得したいで...
# forum
a
タイトルの通りです。国鉄型ワイパー動作に使いたいと思っています。アームの動作まではうまくいきました。
p
質問の意図と逸れてしまい申し訳ないのですが、基本的に動的な座標の取得は複雑で困難ですので、先述したメーターの針のスクリプトの応用で、そうしなくても済むようなスクリプトを組みます。 それを踏まえた上で動的な点を取得したのでしょうか。
y
動かしたいパーツがワイパーでしたら、まず先の方のパーツの回転軸と動作角を求めて設定し、それを子パーツとして大元のアームの動作を実装すると良いかも知れません。 シングルアームパンタグラフの応用で実装出来ます。 https://vxtwitter.com/hi03_s/status/982905805799227392
h
どうしても座標が必要であるというのであれば、ベクトルを支柱に見立てて一緒に回転して計算という実装はどうでしょうか? ベクトルの回転処理は比較的計算コストが高いので常用するのはあまりおすすめできませんが・・・
Copy code
javascript
importPackage(Packages.jp.ngt.ngtlib.math);//Vec3を使用する準備
︙
var vec1 = new Vec3(x, y, z);//Vec3のインスタンス化  支柱の回転軸を原点(0, 0, 0)とした先端の座標を入れる
var pos = [x, y, z]//支柱の回転軸の座標を入れる

var rotatedVec1 = vec1.rotateAroundZ(rotate);//Z軸基準の回転
var rotatedVec2 = rotatedVec1.rotateAroundY(yaw);//Y軸基準の回転 (ワイパーの面がY軸を基準に傾いている場合)
var rotatedVec3 = rotatedVec2.rotateAroundX(pitch);//X軸基準の回転 (ワイパーの面がX軸を基準に傾いている場合)

pos[0] = pos[0] + rotatedVec3.getX();//座標を取得
pos[1] = pos[1] + rotatedVec3.getY();//座標を取得
pos[2] = pos[2] + rotatedVec3.getZ();//座標を取得
もし先端のパーツの移動処理を実装するために使用するというのであれば、ゆきゆきさんの言っている通り先端パーツを子パーツとして"親パーツごと動かす→子パーツを動かす"という処理を実装する方がいいです。
p
これを言おうと思ったのですが、多分renderer.rotate(rotate, angle, x, y, z)を使ってるだろうなと思い、原点中心の回転ではないから、その場合どうしたらいいのでしょうかね…
原点に並行移動→回転→元の場所に並行移動か
a
お三方このような無理難題にお付き合い頂き有難うございます(汗) まずは提案して頂いた方法を応用してみようかと思います。
p
子パーツの方の回転軸の指定は、回転させる前の状態での座標を入力します。この状態(子パーツ)は、GL11.glPopMatrix()を実行するまで続きます。
どういうことかというと、最後にこの処置をしなかったり、子パーツ化の始まりであるGL11.glPushMatrix()との数が合わなかったりすると、その後の描画全体が崩れてしまいます。
a
pos[0],pos[2],pos[3],はそれぞれ、renderPartRotateの回転軸に入れる形になりますか?
h
そもそもなんですがrenderPartRotateは独自の実装関数ですかね?回転処理というと大抵はrenderer.rotate()かGL11.glRotatef()だと思うんですが・・・
もし私のスクリプトからの引用という話であれば、renderPartRotate(part, angle, x, y, z, axisArray[])なので、x,y,zは回転の中心座標、axisArrayは配列で回転軸のベクトルを指定する形になります。
あの処理は単体のパーツを回転させる処理に用いるものなので子パーツを含むような処理には使えません。
a
失礼しました。書き漏らしていましたが仰る通り引用になります。 renderer.rotateの回転の中心座標xyzにpos[0],pos[2],pos[3]がそれぞれ入る形になるんでしょうか。
p
ちょっと遮る形で申し訳ないですが、以下のような組み方がおすすめです
このようなワイパーの動作を想定しています
a
そのように実装してみると見事に動作しました。ありがとうございます!!!