Пример #1
0
        // (ベクトル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);
        }
Пример #2
0
        // 指定したボーン位置に合わせた剛体を生成
        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);
        }