예제 #1
0
        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);
            });
        }
예제 #2
0
    // 球面三角形補間(ベクトル)
    //  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));
    }
예제 #3
0
    // 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;
    }
예제 #4
0
 // 視点をリセット
 public void resetPose(Vector3 forward)
 {
     SphereSurfUtil.convPosToPoler(forward, out pitchRot_, out yawRot_);
 }
예제 #5
0
    // 星座を並べる
    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);
    }