// (ベクトル1→ベクトル2)にフィットするような剛体を生成 public void MakeBodyFromTwoVector(string bone_name, Vector3 v1, Vector3 v2) { PMD_RBody rbody = new PMD_RBody(); rbody.name = bone_name; // 諸データ:名称 // 頭 rbody.rel_bone_id = GetBoneIDByName(bone_name); // 諸データ:関連ボーン番号 // 03 00 == 3 // 頭 float x1 = v1.X; float y1 = v1.Y; float z1 = v1.Z; float x2 = v2.X; float y2 = v2.Y; float z2 = v2.Z; double L = Math.Sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1) + (z2 - z1) * (z2 - z1)); // 位置:位置(x, y, z) rbody.position.X = 0.5f * (x1 + x2); rbody.position.Y = 0.5f * (y1 + y2); rbody.position.Z = 0.5f * (z1 + z2); // 位置:回転(rad(x), rad(y), rad(z)) if (y1 >= y2) { rbody.rotation.X = (float)Math.Asin((z1 - z2) / L); } else { rbody.rotation.X = (float)Math.Asin((z2 - z1) / L); } if (y1 >= y2) { rbody.rotation.Z = (float)Math.Asin(-(x1 - x2) / L); } else { rbody.rotation.Z = (float)Math.Asin(-(x2 - x1) / L); } rbody.group_id = 0; // 諸データ:グループ // 00 rbody.group_non_collision = 0xFFFF; // 諸データ:グループ:対象 // 0xFFFFとの差 // 38 FE rbody.shape_id = 2; // 形状:タイプ(0:球、1:箱、2:カプセル) // 00 // 球 // 形状:半径(幅) // CD CC CC 3F // 1.6 // 形状:高さ // CD CC CC 3D // 0.1 rbody.size = new Vector3(0.4f, (float)(L * 0.8), 0.0f); rbody.weight = 0.5f; // 諸データ:質量 // 00 00 80 3F // 1.0 rbody.position_dim = 0.5f; // 諸データ:移動減 // 00 00 00 00 rbody.rotation_dim = 0.5f; // 諸データ:回転減 // 00 00 00 00 rbody.recoil = 0.0f; // 諸データ:反発力 // 00 00 00 00 rbody.friction = 0.0f; // 諸データ:摩擦力 // 00 00 00 00 rbody.type = 0; // 諸データ:タイプ(0:Bone追従、1:物理演算、2:物理演算(Bone位置合せ)) // 00 // Bone追従 bodies.Add(rbody); }
// 指定したボーン位置に合わせた剛体を生成 public void MakeBodyFromBoneEnd(short bone_num) { PMD_RBody rbody = new PMD_RBody(); rbody.name = nodes[bone_num].name; // 諸データ:名称 // 頭 rbody.rel_bone_id = bone_num; // 諸データ:関連ボーン番号 // 03 00 == 3 // 頭 rbody.position = nodes[bone_num].position; rbody.group_id = 0; // 諸データ:グループ // 00 rbody.group_non_collision = 0xFFFF; // 諸データ:グループ:対象 // 0xFFFFとの差 // 38 FE rbody.shape_id = 0; // 形状:タイプ(0:球、1:箱、2:カプセル) // 00 // 球 rbody.size = new Vector3(0.4f, 0.0f, 0.0f); // 形状:半径(幅) // CD CC CC 3F // 1.6 rbody.weight = 0.5f; // 諸データ:質量 // 00 00 80 3F // 1.0 rbody.position_dim = 0.5f; // 諸データ:移動減 // 00 00 00 00 rbody.rotation_dim = 0.5f; // 諸データ:回転減 // 00 00 00 00 rbody.recoil = 0.0f; // 諸データ:反発力 // 00 00 00 00 rbody.friction = 0.0f; // 諸データ:摩擦力 // 00 00 00 00 rbody.type = 0; // 諸データ:タイプ(0:Bone追従、1:物理演算、2:物理演算(Bone位置合せ)) // 00 // Bone追従 bodies.Add(rbody); }