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); } }
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; }
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; * } */ }
// クリッパー(クリップ平面=ビューボリュームの各面)を作る. 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); } } }