🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

2868閲覧

convexをオフにした状態、または、iskinematicをオンにした状態で、addForceを使用する方法

mZtoewtdmkYLI6o

総合スコア14

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2019/12/01 14:12

目的

UnityのMLAgentsを使って機会学習をしています。
ボールを投げるような学習をさせようと、環境を作っています。

困っている点

投げるためのボールと、コップの様な形をしたHandAgentを3Dオブジェクトで作りました。
Handの中にボールが入るようにしたいため、Rigidbodyのconvexをオフにしたところ、

Non-convex MeshCollider with non-kinematic Rigidbody is no longer supported since Unity 5.
If you want to use a non-convex mesh either make the Rigidbody kinematic or remove the Rigidbody component. Scene hierarchy path "ThrowAwayHandAgent", Mesh asset path "" Mesh name "pb_Mesh6878"

というエラーが出たため、iskinematicをオンにしました。
しかし、iskinematicをオンにすると、物理演算の影響を無くすことになり、addForceなどを使ってHandを制御することが出来なくなります。

試したこと

addForceではなく、Transform.positionを操作することによりHandAgentsを移動させることは出来ましたが、目的であるボールを投げるためには、positionの操作では力が伝わらないため思い通りになりません。

質問

  • convexをオフにした状態で、addForceを使う方法
  • iskinematicをオンにした状態で、addForceを使用する方法
  • Non-convex MeshCollider と non-kinematic Rigidbodyを両立させる方法 (旧バージョンにすればよいのでしょうか?)
  • その他の解決方法

以上について、なにかアイディアがありましたら教えていただきたいです。

開発環境など

ボールは3Dオブジェクトから作成し、Sphere Colliderのコンポーネントがついています。
Handはprobuilderを使用して作成し、Mesh Colliderがついています。
ボールとHandAgentはどちらもRigidbodyがついており、Use Gravityはオンになっています。

開発環境 windows 10 Home
mlagentsのバージョン0.6.0
Unityのバージョン 2018.4.10.f1

ソースコード

関係あるかわかりませんが、一応ソースコードを載せておきます。

C#

1using System.Collections; 2using System.Collections.Generic; 3using MLAgents; 4using UnityEngine; 5 6public class TrowAwayHandAgent : Agent { 7 public Transform tBall; 8 public Rigidbody rBall; 9 int catchFlag; 10 11 Rigidbody rBody; 12 Transform tBody; 13 // Start is called before the first frame update 14 void Start () { 15 rBody = GetComponent<Rigidbody> (); 16 tBody = GetComponent<Transform> (); 17 catchFlag = 0; 18 } 19 20 public override void AgentReset () { 21 Debug.Log ("Reset"); 22 tBall.position=new Vector3 (-1.0f, 5.0f, 0); 23 rBall.position = new Vector3 (-1, 5, 0); 24 rBody.position = new Vector3 (-1, 1, 0); 25 tBody.transform.rotation = Quaternion.Euler(0.0f, 0.0f, 0.0f); 26 rBody.velocity = Vector3.zero; 27 rBall.velocity = Vector3.zero; 28 catchFlag = 0; 29 } 30 31 public override void CollectObservations () { 32 AddVectorObs (rBall.position); 33 AddVectorObs (rBody.position); 34 AddVectorObs (rBody.rotation); 35 } 36 37 public override void AgentAction (float[] vectorAction, string textAction) { 38 Vector3 RSignal = Vector3.zero; 39 Vector3 ForceSginal = Vector3.zero; 40 float distanceToBall = Vector3.Distance (tBall.position, rBody.position); 41 42 RSignal.x = vectorAction[0]; 43 RSignal.y = vectorAction[1]; 44 RSignal.z = vectorAction[2]; 45 46 ForceSginal.x = vectorAction[3]; 47 ForceSginal.y = vectorAction[4]; 48 ForceSginal.z = vectorAction[5]; 49 50 rBody.angularVelocity = RSignal * 0.1f * Mathf.PI; 51 if (catchFlag>4) { 52 // rBody.AddForce (ForceSginal*10, ForceMode.Impulse); 53 tBody.position=tBody.position+ForceSginal; 54 AddReward (2); 55 56 } else { 57 // rBody.AddForce (ForceSginal*10,ForceMode.Force); 58 tBody.position=tBody.position+ForceSginal; 59 AddReward (5-RSignal.magnitude); 60 if (distanceToBall < 0.1) { 61 Debug.Log ("catch"); 62 AddReward (100); 63 catchFlag++; 64 } 65 } 66 if (tBall.position.y < 1.1) { 67 AddReward (tBall.position.x * 1); 68 Debug.Log ("Fall Ball"); 69 Done (); 70 } 71 if (rBody.position.x > 0) { 72 AddReward (-100); 73 Debug.Log ("Hand out"); 74 Done (); 75 } 76 } 77}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

一番手軽なのは他のコライダーで代替する方法です。

Handの子にBoxColliderをつけた空オブジェクトをいくつか作成します。(空オブジェクトにすると回転などの調整がやりやすいため)
あとはコップの形になるように位置やサイズを調整しながらコライダーをはっていきます。

Hand自体にはRigidbodyをつけてあげればOKです。

投稿2019/12/02 00:22

hogefugapiyo

総合スコア3302

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mZtoewtdmkYLI6o

2019/12/02 12:33

回答ありがとうございます。 なるほど、円筒では無くなりますが、出来そうですね。 試してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問