protected override void innerInit() { parent_.toTitleBtn_.gameObject.SetActive(false); lat_ = Mathf.Sin(0) * 88.0f; longi_ = Mathf.Cos(0) * 180.0f + 180.0f; var camerQ = Camera.main.transform.rotation; var initQ = Quaternion.LookRotation(SphereSurfUtil.convPolerToPos(lat_, longi_), Vector3.up); GlobalState.time(5.0f, (sec, t) => { Camera.main.transform.rotation = Lerps.Quaternion.easeInOut(camerQ, initQ, t); return(true); }).next(() => { latDeg_ += Time.deltaTime * 3.0f; longDeg_ += Time.deltaTime * 5.0f; lat_ = Mathf.Sin(latDeg_ * Mathf.Deg2Rad) * 88.0f; longi_ = Mathf.Cos(longDeg_ * Mathf.Deg2Rad) * 180.0f + 180.0f; var pos = SphereSurfUtil.convPolerToPos(lat_, longi_); Camera.main.transform.rotation = Quaternion.LookRotation(pos, Vector3.up); if (Input.GetMouseButtonDown(0) == true) { parent_.resetAll(false); parent_.load(); parent_.nextState_ = new Title(parent_); return(false); } return(true); }); }
// 球面三角形補間(ベクトル) // p0, p1, p2: 球面上の3点 // pos : 三角形内の点座標 // v0, v1, v2: p0, p1, p2それぞれの点での値 // 戻り値 : 補間値 static public Vector3 triInterpolateV3( Vector3 p0, Vector3 p1, Vector3 p2, Vector3 pos, Vector3 v0, Vector3 v1, Vector3 v2 ) { float S0 = SphereSurfUtil.calcArea(1.0f, pos, p1, p2); float S1 = SphereSurfUtil.calcArea(1.0f, pos, p0, p2); float S2 = SphereSurfUtil.calcArea(1.0f, pos, p0, p1); return((v0 * S0 + v1 * S1 + v2 * S2) / (S0 + S1 + S2)); }
// Update is called once per frame void Update() { // Escapeで強制カーソル表示後に画面内をクリックしたら // カーソルを再度非表示に if ( bEscape_ == true && Input.mousePosition.x >= 0 && Input.mousePosition.x <= Screen.width && Input.mousePosition.y >= 0 && Input.mousePosition.y <= Screen.height && Input.GetMouseButtonDown(0) == true ) { bVisibleCursor_ = false; preVisibleCursor_ = true; bEscape_ = false; } if (bVisibleCursor_ != preVisibleCursor_) { Cursor.visible = bVisibleCursor_; if (bVisibleCursor_ == false) { // カーソルを画面内に固定 Cursor.lockState = CursorLockMode.Locked; } else { // 移動範囲解放 Cursor.lockState = CursorLockMode.None; } } preVisibleCursor_ = bVisibleCursor_; // ESCでカーソルを強制表示 if (Input.GetKeyDown(KeyCode.Escape) == true) { bVisibleCursor_ = true; bEscape_ = true; return; } // FPSカメラはカーソルがOFFの時だけアクティブ if (bVisibleCursor_ == true) { return; } // マウスモーションを許可した時だけアクティブ if (bEnable_ == false) { return; } // 基点からの相対値で軸回転角度を算出 // X軸方向:Y軸差分回転量 // Y軸方向:X軸回転量 (minPitchAngle_~maxPitchAngle_) Vector2 refDist = new Vector2(Input.GetAxis("Mouse X"), Input.GetAxis("Mouse Y")) * sensitivity_; refDist.x *= -1.0f; // マウスを左右に移動したらそちらへ向く if (pitchRot_ + refDist.y < minPitchAngle_) { pitchRot_ = minPitchAngle_; } else if (pitchRot_ + refDist.y > maxPitchAngle_) { pitchRot_ = maxPitchAngle_; } else { pitchRot_ += refDist.y; } yawRot_ += refDist.x; var forward = SphereSurfUtil.convPolerToPos(pitchRot_, yawRot_); var q = Quaternion.LookRotation(forward); transform.localRotation = q; // WASDで移動(現在の姿勢ベース) // AD: 左右へ平行移動 // WS: 前後へ平行移動 Vector3 xMove = Vector3.zero; Vector3 yMove = Vector3.zero; if (Input.GetKey(KeyCode.A) == true) { xMove -= transform.right * moveSpeed_; } if (Input.GetKey(KeyCode.D) == true) { xMove += transform.right * moveSpeed_; } if (Input.GetKey(KeyCode.S) == true) { var f = transform.forward; f.y = 0.0f; yMove -= f.normalized * moveSpeed_; } if (Input.GetKey(KeyCode.W) == true) { var f = transform.forward; f.y = 0.0f; yMove += f.normalized * moveSpeed_; } var p = transform.localPosition; p += xMove + yMove; if (p.x < moveRangeMin_.x) { p.x = moveRangeMin_.x; } else if (p.x > moveRangeMax_.x) { p.x = moveRangeMax_.x; } if (p.z < moveRangeMin_.z) { p.z = moveRangeMin_.z; } else if (p.z > moveRangeMax_.z) { p.z = moveRangeMax_.z; } transform.localPosition = p; }
// 視点をリセット public void resetPose(Vector3 forward) { SphereSurfUtil.convPosToPoler(forward, out pitchRot_, out yawRot_); }
// 星座を並べる AABB createAsterism( int astId, float radius, Star starPrefab, AstLine linePrefab, ref List <Star> stars, ref List <AstLine> lines, bool useAutoScale, float alpha, float colorScale, float randomRange ) { var d = AsterismDataUtil.getData(astId); // 恒星のAABB範囲を先に計算 List <Vector3> poses = new List <Vector3>(); for (int i = 0; i < d.stars_.Count; ++i) { var star = d.stars_[i]; var pos = SphereSurfUtil.convPolerToPos(star.pos_.x, star.pos_.y); poses.Add(pos); } var aabb = new AABB(); Vector3 aabbMin = Vector3.zero; Vector3 aabbMax = Vector3.zero; Ranges.aabb3(poses, out aabbMin, out aabbMax); float diagoLen = (aabbMax - aabbMin).magnitude; float range = diagoLen * 0.5f * radius; float astRangeScale = (useAutoScale ? 0.01f + 0.1f * range : 1.0f); aabb.min_ = aabbMin; aabb.max_ = aabbMax; // 恒星 var starPosDict = new Dictionary <int, Vector3>(); for (int i = 0; i < d.stars_.Count; ++i) { var star = d.stars_[i]; var obj = Instantiate <Star>(starPrefab); var pos = SphereSurfUtil.convPolerToPos(star.pos_.x, star.pos_.y); float R = radius + Random.Range(-range, range) * randomRange; // 距離 obj.transform.position = pos * R; var scale = obj.transform.localScale; obj.transform.localScale = scale * (R / radius) * astRangeScale; obj.setHipId(star.hipId_); obj.setPolerCoord(star.pos_.x, star.pos_.y); obj.setColor(star.color_, alpha); stars.Add(obj); starPosDict[star.hipId_] = obj.transform.position; } // ライン Vector3 lineColor = new Vector3(0.2f, 0.3f, 0.5f); for (int i = 0; i < d.lines_.Count; ++i) { var line = d.lines_[i]; var obj = Instantiate <AstLine>(linePrefab); var spos = starPosDict[line.startHipId_]; var epos = starPosDict[line.endHipId_]; // var spos = SphereSurfUtil.convPolerToPos( line.start_.x, line.start_.y ); // var epos = SphereSurfUtil.convPolerToPos( line.end_.x, line.end_.y ); obj.setLine(spos, epos, astRangeScale); obj.setColor(lineColor, alpha * 0.6f); lines.Add(obj); } return(aabb); }