2017-04-18 10:14:17 qq_34796795 阅读数 2160

最近公司在进行unity中项目的时候,有一个需求就是将Unity进行分屏操作,而由于我们的最终显示设备需要2560*720的分辨率,导致使用正常的VR插件会使得场景中物体拉长,显示不正常.

最终试了很多种方法后,发现Unity自带了一个改变camera的FOV的api:Camera.projectionMatrix,其使用的参数是一个4*4的矩阵,对矩阵进行变换即可对camera的FOV进行操作,而非在edictor中直接进行FOV的缩放,Edictor中FOV的数值更改是等比的.以下为示例代码.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class PhantaCameraRenderer : MonoBehaviour
{
    void Awake ()
    {
        Camera[] cams = GetComponentsInChildren<Camera>();
        foreach (Camera cam in cams)
            cam.projectionMatrix = cam.projectionMatrix * Matrix4x4.Scale(new Vector3(0.5f, 1, 1));
    }
}

效果是将显示出的东西进行左右的压缩,效果如下图

2018-05-31 18:48:50 moonlightpeng 阅读数 376

unity2D,3D的变换只需要修改相机的投影方式。

透视投影:物体近大远小。




平行投影(正交投影):相机远近对看到的物体大小没有影响。




2019-02-11 13:38:10 qq_32095699 阅读数 95

main Camera参数设置:

Projection:投影方式,分为透视投影和正交投影

(透视投影物体会随着相机距离的大小而变化,正交投影则物体大小不会因为距离远近而变化。

参考博客:https://blog.csdn.net/aaronmorgan/article/details/78727773

透视投影
正交投影
正交投影

 Size:视野大小 (正交模式的参数)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CameraFollow : MonoBehaviour {

    public GameObject Player;
    private Vector3 offset;
    private float smoothing = 5f;//Camera移动到目标位置的速度
	// Use this for initialization
	void Start () {
        offset = transform.position - Player.transform.position;
	}
	
	// Update is called once per frame
	void FixedUpdate () {
        Vector3 tartgetCamPos = Player.transform.position + offset;
        transform.position = Vector3.Lerp(transform.position, tartgetCamPos, smoothing * Time.deltaTime);//tartgetCamPos;

    }
}
  1. Lerp是 插值 的概念,这边简单来说就是使相机平滑的移动而不是瞬间移位。
  2. 把CameraFollow.cs拖到Player上。
  3. 把Player设为Prefabs,这一步主要是方便我们导出导入Player。
2018-08-11 14:55:43 themagickeyjianan 阅读数 229

在摄像机的拍摄下,A B2个相同的物体,A物体在远处,B物体在近处。 当他们在一个透视摄像机的拍摄下。投影到视口上时,根据相似三角形的原理,得到投射的4个黑点,很容易看出来,A物体投射到屏幕上物体较小,B大一点。

 

 

 

 

2016-05-22 18:43:44 Ro_Jack 阅读数 1190

写一篇短文回答以下问题。如是做程序,请写步骤,贴代码并解释:
总结摄像机的使用方法。
如何应用左手法则决定方向,应用 Field of view 设置场景大小。
Field of view视角,透视投影时才有的特性。视角越大,能看到的视野也越大,对应的焦距也越短
Camera 继承的类
Component(组件)
Camera 有哪些静态属性,用程序验证并管理所有的 Camera ,并在程序中 enabled 部分有用的 Camera (切换摄像机)
Clear flag、blackground、culling mask、projection、size、field of view、clipping planes、Viewport Rect、Depth。
管理camera:
Camera1.camera.enabled = false;
Camera2.camera.enabled = true;
添加一个 Empty 游戏对象, 添加一个 Camera 部件(Rendering 分类下),有什么效果
具有摄像机的功能。
总结光源的使用。光源是 GameObject 吗?
不是
给 Camera 加一个 聚光灯 玩玩! 实现 聚光灯 跟随摄像机运动。
在camera中点击Add Component->Rendering->Light,然后设置为聚光灯。
给 sun 对象加 点光源 部件。 不许 给 sun 添加子对象。
在sun对象中中点击Add Component->Rendering->Light。
U3d 设计师 没有将 Camera,Light 设计为 GameObject ,这给开发者带来哪些好处?
将Camera,Light设计为component,方便开发者在讲其作为组件添加到各种对象中,方便管理。
面向对象语言接口和超类有哪些异同?
IU3dActionCompleted 能设计为超类吗?为什么? 画 UML 图说明
可以,使用IU3dActionCompleted的类,需要继承IU3dActionCompleted,并实现其方法,和使用接口类似。

U3dAction 能设计为接口吗?为什么? 画 UML 图说明
不能,因为需要作为基本的类,被U3dActionAuto和U3dActionMan继承,方便U3dAction派生类被ActionManager管理,同时当U3dAction为接口时,每个使用它的类都必须实现其方法。

修改简单工厂代码
添加一个新动作,MoveToTargetAction, 然后使用它持续追击一个运动目标。
public class MoveToTargetAction : U3dActionAuto {
public Vector3 target;
public int speed;

    private IU3dActionCompleted monitor = null;

    public void setting(Vector3 target, int speed, IU3dActionCompleted monitor){
        this.target = target;
        this.speed = speed;
        this.monitor = monitor;
    }

    void Update () {
        float step = speed * Time.deltaTime;
        transform.position = Vector3.MoveTowards (transform.position, target, step);

        if (transform.position == target) { // Auto Destroy After Completed
            if (monitor != null) {
                monitor.OnActionCompleted(this);
            }
            Destroy(this);
        }
    }
}

public U3dAction ApplyMoveToTargetAction(GameObject obj, Vector3 target, int speed, IU3dActionCompleted completed){
MoveToTargetAction ac = obj.AddComponent ();
ac.setting (target, speed, completed);
return ac;
}
添加一个新动作,MoveToAB_Action, 然后使用它在两个位置之间来回移动。(组合动作,务必由工厂正确的 Free 子动作)
public class MoveToAB_Action : U3dActionAuto {
public Vector3 targetA, targetB;
public int speed;

    private IU3dActionCompleted monitor = null;

    public void setting(Vector3 targetA, Vector3 targetB, int speed, IU3dActionCompleted monitor){
        this.targetA = targetA;
        this.targetB = targetB;
        this.speed = speed;
        this.monitor = monitor;
    }

    void Update () {
        float step = speed * Time.deltaTime;
        transform.position = Vector3.MoveTowards (transform.position, targetA, step);

        if (transform.position == targetA) {
            Vector3 temp = targetA;
            targetA = targetB;
            targetB = temp;
        }
    }
}

添加一个新动作,MoveToTargetAB_Action, 然后使用它在两个目标之间来回移动。
public class MoveToTargeAB_Action : U3dActionAuto {
public Vector3 targetA, targetB;
public int speed;

    private IU3dActionCompleted monitor = null;

    public void setting(GameObject A, GameObject B, int speed, IU3dActionCompleted monitor){
        this.targetA = A.transform.position;
        this.targetB = B.transform.position;
        this.speed = speed;
        this.monitor = monitor;
    }

    void Update () {
        float step = speed * Time.deltaTime;
        transform.position = Vector3.MoveTowards (transform.position, targetA, step);

        if (transform.position == targetA) {
            Vector3 temp = targetA;
            targetA = targetB;
            targetB = temp;
        }
    }
}

简单工厂的使用有哪些好处!按你的理解,简单工厂还能在游戏中做什么?
工厂类含有必要的判断逻辑,可以决定在什么时候创建哪一个产品类的实例,客户端可以免除直接创建产品对象的责任,而仅仅”消费”产品。简单工厂模式通过这种做法实现了对责任的分割。
简单工厂模式使用场景:工厂类负责创建的对象比较少;客户只知道传入工厂类的参数,对于如何创建对象(逻辑)不关心;简单工厂很容易违反高内聚低耦合原则,因此一般只在很简单的情况下应用。

没有更多推荐了,返回首页