Exemplo n.º 1
0
    private void UpdateSelect(Vector2 mousePosition)
    {
        Ray     ray      = camera.ScreenPointToRay(new Vector3(mousePosition.x, camera.pixelHeight - mousePosition.y, 0));
        Vector3 startPos = ray.origin + halfSpaceSize;
        Vector3 dir      = ray.direction;

        if (selectBlockStage == SelectBlockStage.SelectStart)
        {
            RayCastRestult rlt = rtm.rayCast(startPos, dir, 200, RayCastBlockType.All);
            bShowPreview = rlt.bHit;
            if (rlt.bHit)
            {
                normalIndex = (Face)rlt.hitFaceIndex;
                Vector3 hitPos = startPos + dir * (rlt.hitLength + 0.001f);
                float   gx     = (int)(hitPos.x / Const.BlockSize);
                float   gy     = (int)(hitPos.y / Const.BlockSize);
                float   gz     = (int)(hitPos.z / Const.BlockSize);
                if (curOperator == Operator.AddBlock)
                {
                    selectedBlockPosStart = new Vector3(gx, gy, gz);
                    selectedBlockPosEnd2D = selectedBlockPosStart;
                    previewBlockPosStart  = new Vector3(gx, gy, gz) + Const.getFaceNormal(rlt.hitFaceIndex) * Const.BlockSize;
                    previewBlockPosEnd2D  = previewBlockPosStart;
                    previewBlockPosEnd3D  = previewBlockPosEnd2D;
                }
                else if (curOperator == Operator.DeleteBlock)
                {
                    selectedBlockPosStart = new Vector3(gx, gy, gz);
                    selectedBlockPosEnd2D = selectedBlockPosStart;
                    selectedBlockPosEnd3D = selectedBlockPosEnd2D;
                }
            }
            else
            {
                normalIndex = Face.FNI_y1;
                Vector3 faceNormal = Vector3.up;                   //表面法线
                float   camToFace  = startPos.y - halfSpaceSize.y; //摄像机到表面的垂直线
                float   factor     = Vector3.Dot(-faceNormal, dir);
                if (factor > 0.0001)
                {
                    Vector3 hitPos = startPos + dir * (camToFace / factor + 0.001f);
                    float   gx     = (int)(hitPos.x / Const.BlockSize);
                    float   gy     = (int)(hitPos.y / Const.BlockSize);
                    float   gz     = (int)(hitPos.z / Const.BlockSize);
                    if (curOperator == Operator.AddBlock)
                    {
                        previewBlockPosStart = new Vector3(gx, gy, gz) + Vector3.up * Const.BlockSize;
                        previewBlockPosEnd2D = previewBlockPosStart;
                        previewBlockPosEnd3D = previewBlockPosEnd2D;
                    }
                    else if (curOperator == Operator.DeleteBlock)
                    {
                        selectedBlockPosStart = new Vector3(gx, gy, gz);
                        selectedBlockPosEnd2D = selectedBlockPosStart;
                        selectedBlockPosEnd3D = selectedBlockPosEnd2D;
                    }
                    bShowPreview = true;
                }
                else
                {
                    bShowPreview = false;
                }
            }
        }
        else if (selectBlockStage == SelectBlockStage.SelectEnd2D)
        {
            if (curOperator == Operator.AddBlock)
            {
                //计算摄像机在操作平面上的投影点
                Vector3 camToStart = previewBlockPosStart - startPos;                 //摄像机到开始点
                Vector3 faceNormal = Const.getFaceNormal((int)normalIndex);           //表面法线
                float   camToFace  = Vector3.Dot(camToStart, -faceNormal) + 0.49999f; //摄像机到表面的垂直线
                float   factor     = Vector3.Dot(-faceNormal, dir);
                if (factor > 0.0001)
                {
                    previewBlockPosEnd2D = startPos + dir * (camToFace / factor);
                    previewBlockPosEnd3D = previewBlockPosEnd2D;
                    //Debug.Log(previewBlockPosEnd.ToString());
                    bShowPreview = true;
                }
                else
                {
                    bShowPreview = false;
                }
            }
            else if (curOperator == Operator.DeleteBlock)
            {
                //计算摄像机在操作平面上的投影点
                Vector3 camToStart = selectedBlockPosStart - startPos;      //摄像机到开始点
                Vector3 faceNormal = Const.getFaceNormal((int)normalIndex); //表面法线
                float   camToFace  = Vector3.Dot(camToStart, -faceNormal) + 0.49999f;
                float   factor     = Vector3.Dot(-faceNormal, dir);
                if (factor > 0.0001)
                {
                    selectedBlockPosEnd2D = startPos + dir * (camToFace / factor);
                    selectedBlockPosEnd3D = selectedBlockPosEnd2D;
                    bShowPreview          = true;
                }
                else
                {
                    bShowPreview = false;
                }
            }
        }
        else if (selectBlockStage == SelectBlockStage.SelectEnd3D)
        {
            if (curOperator == Operator.AddBlock)
            {
                //计算摄像机在操作平面上的投影点
                Vector3 camToStart = previewBlockPosEnd2D - startPos;       //摄像机到开始点
                Vector3 faceNormal = Const.getFaceNormal((int)normalIndex); //击中法线
                Vector3 right      = Vector3.Cross(faceNormal, dir).normalized;
                Vector3 forward    = Vector3.Cross(right, faceNormal);      //操作平面的法线
                float   factor     = Vector3.Dot(dir, forward);
                if (factor > 0.0001)
                {
                    bShowPreview = true;
                    Vector3 hitPos = startPos + dir * Vector3.Dot(camToStart, forward) / factor;
                    Vector3 offset = faceNormal * Vector3.Dot((hitPos - previewBlockPosEnd2D), faceNormal);
                    previewBlockPosEnd3D = previewBlockPosEnd2D + offset;
                }
                else
                {
                    bShowPreview = false;
                }
            }
            else if (curOperator == Operator.DeleteBlock)
            {
                //计算摄像机在操作平面上的投影点
                Vector3 camToStart = selectedBlockPosEnd2D - startPos;      //摄像机到开始点
                Vector3 faceNormal = Const.getFaceNormal((int)normalIndex); //击中法线
                Vector3 right      = Vector3.Cross(faceNormal, dir).normalized;
                Vector3 forward    = Vector3.Cross(right, faceNormal);      //操作平面的法线
                float   factor     = Vector3.Dot(dir, forward);
                if (factor > 0.0001)
                {
                    bShowPreview = true;
                    Vector3 hitPos = startPos + dir * Vector3.Dot(camToStart, forward) / factor;
                    Vector3 offset = faceNormal * Vector3.Dot((hitPos - selectedBlockPosEnd2D), faceNormal);
                    selectedBlockPosEnd3D = selectedBlockPosEnd2D + offset;
                }
                else
                {
                    bShowPreview = false;
                }
            }
        }
    }