コード例 #1
0
        public void             create()
        {
            ViewVolumeShape view_volume_shape = new ViewVolumeShape();

            for (int i = 0; i < this.particles.Count; i++)
            {
                Particle particle = this.particles[i];

                particle.create(view_volume_shape, 0.1f, 10000.0f);

                particle.pos = new Vector3(0.0f, 1.0f, 0.0f);
            }
        }
コード例 #2
0
        public static void      calcViewVolumeShape(ViewVolumeShape shape, float fovy, float aspect)
        {
            Vector3 v;

            v.z = 1.0f;
            v.y = Mathf.Tan(fovy * Mathf.Deg2Rad / 2.0f);
            v.x = v.y * aspect;

            shape.rt = v;

            shape.rb    = v;
            shape.rb.y *= -1.0f;

            shape.lt    = v;
            shape.lt.x *= -1.0f;

            shape.lb    = v;
            shape.lb.x *= -1.0f;
            shape.lb.y *= -1.0f;
        }
コード例 #3
0
        public void             create(ViewVolumeShape view_volume, float z_near, float z_far /*, const Matrix4x4f& matrix*/)
        {
            int   i;
            float all;

            float[] ratio = new float[3];
            float   param_min, param_max;

            param_min = Mathf.Abs(z_near);
            param_max = Mathf.Abs(z_far);

            // ・min <= (ratio[0] + ratio[1] + ratio[2]) <= max
            // ・ratio[0] ~ ratio[2] はランダム
            //
            all = Random.Range(param_min, param_max);

            ratio[0] = Random.value * all;
            ratio[1] = Random.value * (all - ratio[0]);
            ratio[2] = all - (ratio[0] + ratio[1]);

            this.cam_local = Vector3.zero;

            if (Random.value < 0.5f)
            {
                this.cam_local = this.cam_local + view_volume.rt * ratio[0];
                this.cam_local = this.cam_local + view_volume.rb * ratio[1];
                this.cam_local = this.cam_local + view_volume.lt * ratio[2];
            }
            else
            {
                this.cam_local = this.cam_local + view_volume.lt * ratio[0];
                this.cam_local = this.cam_local + view_volume.lb * ratio[1];
                this.cam_local = this.cam_local + view_volume.rb * ratio[2];
            }

            this.cam_local_prev = this.cam_local;

            //this.pos = matrix.transform(this.cam_local);

            // ------------------------------------------------------------ //

            this.rot.y = Mathf.Lerp(-180.0f, 180.0f, Random.value);
            this.rot.x = Mathf.Lerp(0.0f, 30.0f, Random.value);
            this.rot.z = 0.0f;

            this.spin.y_ofst  = Mathf.Lerp(-10.0f, 10.0f, Random.value);
            this.spin.z_omega = Mathf.Lerp(10.0f, 45.0f, Random.value);
            this.spin.z_ang   = 0.0f;

/*
 *              // スピードの初期値を求める(近似計算です)
 *              this.calc_init_speed();
 *
 *              // ------------------------------------------------------------ //
 *
 *              this.set_color(Color.white);
 *
 *              // ------------------------------------------------------------ //
 *
 *              for(i = 0;i < SHAPE_VERTEX_NUM;i++) {
 *
 *                      this.vertices[i].uv.u = shape[i].uv.u;
 *                      this.vertices[i].uv.v = shape[i].uv.v;
 *              }
 */
        }
コード例 #4
0
        // クリッパー(クリップ平面=ビューボリュームの各面)を作る.
        public static void      createClipper(ViewVolumeClipper clipper, ViewVolumeShape view_volume, float z_min, float z_max)
        {
            // left

            clipper.plane[(int)VIEW_VOLUME_PLANE.LEFT].tri[0]  = Vector3.zero;
            clipper.plane[(int)VIEW_VOLUME_PLANE.LEFT].tri[1]  = view_volume.lb;
            clipper.plane[(int)VIEW_VOLUME_PLANE.LEFT].tri[2]  = view_volume.lt;
            clipper.plane[(int)VIEW_VOLUME_PLANE.LEFT].is_rect = false;

            // right

            clipper.plane[(int)VIEW_VOLUME_PLANE.RIGHT].tri[0]  = Vector3.zero;
            clipper.plane[(int)VIEW_VOLUME_PLANE.RIGHT].tri[1]  = view_volume.rt;
            clipper.plane[(int)VIEW_VOLUME_PLANE.RIGHT].tri[2]  = view_volume.rb;
            clipper.plane[(int)VIEW_VOLUME_PLANE.RIGHT].is_rect = false;

            // top

            clipper.plane[(int)VIEW_VOLUME_PLANE.TOP].tri[0]  = Vector3.zero;
            clipper.plane[(int)VIEW_VOLUME_PLANE.TOP].tri[1]  = view_volume.lt;
            clipper.plane[(int)VIEW_VOLUME_PLANE.TOP].tri[2]  = view_volume.rt;
            clipper.plane[(int)VIEW_VOLUME_PLANE.TOP].is_rect = false;

            // bottom

            clipper.plane[(int)VIEW_VOLUME_PLANE.BOTTOM].tri[0]  = Vector3.zero;
            clipper.plane[(int)VIEW_VOLUME_PLANE.BOTTOM].tri[1]  = view_volume.rb;
            clipper.plane[(int)VIEW_VOLUME_PLANE.BOTTOM].tri[2]  = view_volume.lb;
            clipper.plane[(int)VIEW_VOLUME_PLANE.BOTTOM].is_rect = false;

            // near

            clipper.plane[(int)VIEW_VOLUME_PLANE.NEAR].tri[0] = view_volume.rb;
            clipper.plane[(int)VIEW_VOLUME_PLANE.NEAR].tri[1] = view_volume.lb;
            clipper.plane[(int)VIEW_VOLUME_PLANE.NEAR].tri[2] = view_volume.rt;

            for (int i = 0; i < 3; i++)
            {
                clipper.plane[(int)VIEW_VOLUME_PLANE.NEAR].tri[i] = clipper.plane[(int)VIEW_VOLUME_PLANE.NEAR].tri[i] * z_min;
            }

            clipper.plane[(int)VIEW_VOLUME_PLANE.NEAR].is_rect = true;

            // far

            clipper.plane[(int)VIEW_VOLUME_PLANE.FAR].tri[0] = view_volume.lb;
            clipper.plane[(int)VIEW_VOLUME_PLANE.FAR].tri[1] = view_volume.rb;
            clipper.plane[(int)VIEW_VOLUME_PLANE.FAR].tri[2] = view_volume.lt;

            for (int i = 0; i < 3; i++)
            {
                clipper.plane[(int)VIEW_VOLUME_PLANE.FAR].tri[i] = clipper.plane[(int)VIEW_VOLUME_PLANE.FAR].tri[i] * z_max;
            }

            clipper.plane[(int)VIEW_VOLUME_PLANE.FAR].is_rect = true;

            // ------------------------------------------------------------ //

            for (int i = 0; i < (int)VIEW_VOLUME_PLANE.NUM; i++)
            {
                ViewVolumeClipper.Plane plane = clipper.plane[i];

                if (!MathUtility.calcPolygonNormal(ref plane.normal, plane.tri))
                {
                    plane.normal = Vector3.up;
                }

                plane.space = MathUtility.calcTriSpace(plane.tri, plane.is_rect);

                if (i == (int)VIEW_VOLUME_PLANE.NEAR || i == (int)VIEW_VOLUME_PLANE.FAR)
                {
                }
                else
                {
                    // NEAR と FAR 以外は Z の範囲が 0.0 ~ 1.0 なので。
                    // (本当は zmin ~ zmax の大きさ)
                    plane.space *= MathUtility.square(z_max);
                }
            }
        }