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


HSPTV!掲示板


未解決 解決 停止 削除要請

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


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は、できると思いますが、もう少し頑張って報告できる形にしようと思っております。
 ( ;∀;)



youdai

リンク

2023/4/18(Tue) 15:53:43|NO.99311

DirectX系の講座ですが、「クォータニオンでボーンを制御すること」についての技術講座がありました。
これを参考にスクリプトを組めれば、HSP3上でのマニュアルのIKも可能になるかもしれません。

その21 クォータニオンによるボーンの姿勢制御
http://marupeke296.sakura.ne.jp/DXG_No21_BoneControlUsingQuaternion.html

クォータニオン計算についてはgenkiさん作のmod_quaternionが便利だと思います。

クォータニオン計算モジュール mod_quaternion ( genkiさん作 )
https://mclab.uunyan.com/dl/dl60.htm

もし行列計算が必要になる場合は、同じくgenkiさん作の行列計算モジュールが便利だと思います。

行列計算モジュール ( genkiさん作 )
https://mclab.uunyan.com/dl/dl47.htm

もし大量のボーンがあって、大量の行列計算が必要な場合はGPU演算を使うという手もあります。
pippiさん作のHSPCL32NでOpenCLが使用できます。(HSPCL32NはHSPCL64の32bit版のようなもの)

HSPCL32N ( pippiさん作 )
https://github.com/toropippi/HSPCL32N



usagi

リンク

2023/4/20(Thu) 01:55:33|NO.99314

こんにちわ。やりたい事と一致しているか分かりませんが、数学的な解決とは別アプローチで。。。

hgimg4はnullノードというパラメータや計算だけに使えるようなノードを追加できますので、それを使っては如何でしょうか。

自前でベクトルやクォータニオンの計算をスクリプト制御するより、
コンパイル済の用意された命令を使う方が高速で動きますし、簡単かと思いました。
※もちろん自前で組んだ方が楽しいと思います。

簡単なサンプルですが、どうぞ。
※実際にはコンストレイントを色々かける必要があるとは思いますが、とりあえず足が動きます。


; hgimg4は右手座標 #include "hgimg4.as" ; y ; |__ x ;z/ chdir dir_exe+"\\sample\\hgimg4" debug = 1 ; ★ここを切り替える ; モデル読み込み gpreset : setcls CLSMODE_SOLID, $0 gpload id_model,"res/tamane2" ; gpnodeinfo infonode,id_model, GPNODEINFO_NODE, "asi_L_" ; 制御 if(debug) { ; デバック時はモデル表示する。確認に便利 gpcolormat mat, $00FF00, 45 : gpmeshclear gpmeshadd v1,-5,0,0: gpmeshadd v2,5,0,0: gpmeshadd v3,0,0,50: gpmeshpolygon v1,v2,v3; 平面 gpmeshadd v1,0,0,0: gpmeshadd v2,0,5,0: gpmeshadd v3,0,0,50: gpmeshpolygon v1,v2,v3; 縦 gpmesh id_bone, , mat gpbox id_target, 10, $00FFFF } else { ; リリース時は制御用のNullノードで高速化と非表示 gpnull id_bone gpnull id_target } ; ターゲット初期位置 setpos id_target, 10,0, 20 *main redraw 0 ; ターゲット移動(リグ的な感じを想定) ;-------------------- stick pad, 15|$8000|$20000 if pad&$00001 : addpos id_target,-1 if pad&$00004 : addpos id_target,1 if pad&$00002 : addpos id_target,,1 if pad&$00008 : addpos id_target,,-1 if pad&$08000 : addpos id_target,,,-1 if pad&$20000 : addpos id_target,,,1 ; 制御 ;-------------------- ; 面倒なのでカメラ原点 setpos GPOBJ_CAMERA, 0,0,0 ; ノードのトランスフォーム getpos infonode, px, py, pz : getang infonode, ax, ay, az : getquat infonode, qx, qy, qz, qw ; ボーンの先端位置調整 setpos id_bone, px-2,py-30,pz; 今回は膝の位置なのでつま先へ移動 ; ターゲットの位置取得してボーンを向ける getpos id_target, tx, ty, tz : gplookat id_bone, tx,ty,tz addang id_bone, 0, deg2rad(180), 0; ↑lookatで反対向くので反転 ; ボーンの向きをノードに設定 getquat id_bone,x,y,z,w : setquat infonode,x,y,z,w ; 描画 ;-------------------- ; カメラ設定 setpos GPOBJ_CAMERA, 0, 100, 400 setang GPOBJ_CAMERA, 0, 0, 0 color 255,255,255:pos 8,8:mes "ターゲット移動{X:←→, Y:↑↓}" gpdraw: redraw 1: await 16 goto *main



buhio

リンク

2023/4/20(Thu) 08:14:57|NO.99320

おぉぉぉ

youdaiさん usagiさん

ありがとうございます。研究してかならず報告します。
ちょっと仕事がアレなので、お時間ください🐷



buhio

リンク

2023/5/4(Thu) 20:57:03|NO.99396

 こんにちわ。

 いろいろとアドバイスをいただき、なんとか当初の目標に近い動きができましたので、
ご報告いたします。
 ソースが長くなってしまったので、ご興味のある方はダウンロードしてテストしてみてください。
tamaneちゃんがうねうね動くようになりました。

https://sites.google.com/view/buhio/

 なお、角度制限(コンストレイント)が課題となります。ソースも無駄が多い気がするので、改善の余地ありです。
一旦、解決とさせていただきますが、角度制限について情報をお持ちの方は、ご教示いただければ幸いです。
 



記事削除

記事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.