HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2023
0121
buhioIKのようなものがしたくて、ハマっています(内積・外積・クオータニオン)3未解決


buhio

リンク

2023/1/21(Sat) 19:49:22|NO.99019

  皆さんこんにちわ。hgimg4でInverceKinematicsのようなものができないかと挑戦し、やはりハマりました。
 サンプルのtameneちゃんには、右膝の(kuru_R_)、右足首の(asi_R_)があります。
 目標:右足首をターゲットに向ける→いきなりここで躓きました。

 .錙璽襯匹硫鹽哨璽蹐離戰トル(vec0)と右膝を原点として右足首へのベクトル(vec1)との角度を算出

 右膝を原点として右足首へのベクトル(vec1)と右膝を原点としてターゲットへのベクトル(vec2)との角度を算出

 1ι┐豊△硫鹽召鯏用し、さらに,硫鹽召鯏用する

 ぢ首がターゲットを向く

 と、必死で考えましたが、なんか思ったようになりません。数学が厳しいです。

 おかしな点(ゼロベースでやり直し含む)、ご指摘いただければ幸いです。
 

 (gplookatは子ノードに使えないようです)
 (子ノードへのgetposがカメラ位置姿勢によって値が変わるのは認識しているので、cx,cyはカメラの影響をいったん回避するためです

 


 LookAtTarget "asi_R_","kuru_R_",x,y,z

return

#deffunc LookAtTarget str _myname,str _parentname,double _tgtx,double _tgty,double _tgtz

gpnodeinfo id,id_model2,GPNODEINFO_NODE,_parentname
setquat id,0,0,0,-1
getpos id,lx1,ly1,lz1
gpnodeinfo id,id_model2,GPNODEINFO_NODE,_myname
getpos id,lx2,ly2,lz2

vec0(0)=0.0f:vec0(1)=0.0f:vec0(2)=1.0f;ワールドの基準ベクトル

vec1(0)=(double(lx2)+cx)-(double(lx1)+cx)
vec1(1)=(double(ly2)+cy)-(double(ly1)+cy)
vec1(2)=(double(lz2)+cz)-(double(lz1)+cz)
Vec3dNormalize vec1;→正規化(元々正規化の固定なら不要)

Vec3dCrossProduct vec3,vec1,vec0;足首と基準との外積
Vec3dNormalize vec3;→正規化
Vec3dDotProduct val,vec1,vec0;内積
theta=acos(val)*180/3.141592;内積から角度を求める
QuatRotate vec3,theta;vec3という軸に対してtheta度の回転クオータニオン
;ワールドにおける姿勢が取得された

vec2(0)=_tgtx-(double(lx1)+cx)
vec2(1)=_tgty-(double(ly1)+cy)
vec2(2)=_tgtz-(double(lz1)+cz)
Vec3dNormalize vec2;→正規化

Vec3dCrossProduct vec4,vec1,vec2;足首とターゲットの外積
Vec3dNormalize vec4;→正規化
Vec3dDotProduct val,vec1,vec2;内積
theta=acos(val)*180/3.141592;内積から角度を求める
QuatRotate vec4,theta;vec3という軸に対してtheta度の回転クオータニオン

gpnodeinfo id,id_model2,GPNODEINFO_NODE,_parentname
getquat id,x,y,z,w
quatmul q3,vec4(0),vec4(1),vec4(2),vec4(3),x,y,z,w;回転quat×モデル(kuru_R_)のquat
quatmul q3,vec3(0),vec3(1),vec3(2),vec3(3),q3(0),q3(1),q3(2),q3(3);回転quat×モデルのquat
setquat id,q3(0),q3(1),q3(2),q3(3);結果を適用



この記事に返信する


buhio

リンク

2023/1/21(Sat) 19:56:48|NO.99020

1か月これで悩んでいます🐖。。。



kinokawa

リンク

2023/3/20(Mon) 21:40:27|NO.99179

buhioさん はじめまして

トピックが作られてから2か月も経ってから
書き込むのはどうかと思いましたが
IKに興味があったので書いてみます

ただ私はIKについてはまったくの初心者なので
あまりお役には立てないかと思います(^^

ですが・・まずなにかやってみようと思い
流行りのGPTで調べたらそれなりの
コードが見つかりました(C言語ですが・・・

それをhsp3に移植してみようと思ったのですが
たとえうまく移植出来ても

足首の値を変更して本当に足首だけが動くことを
確認してからでないと無駄になってしまうと思いました

でたらめな数値でもいいので足首だけが変な動きになるとか
なにか動きに変化があることを確認したかったので

サンプルファイル
; gpnodeinfo sample
; 珠音(たまね)3D modelのモデル階層を表示


getpos infonode,x,y,z
の次に
setquat infonode,x*x,y*y,z*z
とか
setpos infonode,x*x,y*y,z*z
とかを追加してみたのですが変化はありませんでした

gpnodeinfo の説明には 特別なオブジェクトID と書いていますが
特別なオブジェクトIDの値を直接変更することは出来るのか気になりました

これができないと私にはhsp3でのIKはちょっと難しそうです(^^;



buhio

リンク

2023/3/24(Fri) 19:17:25|NO.99189

kinokawaさん

 ご返信ありがとうございます〜
 gpnodeinfo命令は、くせが強いので、まとめている最中なのです。
 gpnodeinfoが返すオブジェクトIDは、整数型ではないようで、gpnodeinfo命令を実行するたびに値が更新されるようです。
 したがって、階層モデルの子モデルのIDを保存しておくことができなくて、子モデルのIDを使用する前にgpnodeinfoしてやる必要があるようです。
 ヘルプに記載はありませんが、いまのところ私の方ではそうとしか考えられません。
 
 IKは、できると思いますが、もう少し頑張って報告できる形にしようと思っております。
 ( ;∀;)



記事削除

記事NO.パスワード
(質問が解決したスレッドは他の利用者に活用してもらうため、削除しないようお願いします)

NO.99019への返信

マスコット

好きなマスコットを選んでください。

名前

e-mail
HOME
  1. 初めて利用する方は、HSP3掲示板の使い方をお読みください。
  2. 不要部分の多い長いスクリプトの投稿は ご遠慮ください。
  3. 書き込みは自動改行されません。適度に改行を入れてください。
  4. スクリプトは小文字の<pre>〜</pre>で囲むと見やすく表示できます。

削除用パスワード

解決したら質問者本人がここをチェックしてください。

エラー発生時、再送信すると二重送信になることがあります。
回答が得られたら、お礼書き込み時に[解決]チェックしてください。
SPAM防止のためURLから始まる文章は投稿できません。
SPAM防止のため英文字のみの本文を投稿することはできません。

ONION software Copyright 1997-2023(c) All rights reserved.