正投影カメラを使用しており、特定のポイントへのズーム機能を実装したいと考えています。つまり、写真があり、写真の特定の部分にズームしたいとします。
ズームインする方法は知っていますが、問題は、目的のゾーンに焦点が合っている位置にカメラを移動することです。
どうすればそうできますか?
正投影カメラを使用しており、特定のポイントへのズーム機能を実装したいと考えています。つまり、写真があり、写真の特定の部分にズームしたいとします。
ズームインする方法は知っていますが、問題は、目的のゾーンに焦点が合っている位置にカメラを移動することです。
どうすればそうできますか?
このコード例がお役に立てば幸いです。コピーして貼り付けてください。注: このスクリプトは、カメラ オブジェクトにアタッチされていることを前提としています。それ以外の場合は、トランスフォームをカメラ オブジェクト参照に調整する必要があります。
private float lastZoomDistance = float.PositiveInfinity; // remember that this should be reset to infinite on touch end
private float maxZoomOut = 200;
private float maxZoomIn = 50;
private float zoomSpeed = 2;
void Update() {
if (Input.touchCount >= 2) {
Vector2 touch0, touch1;
float distance;
Vector2 pos = new Vector2(transform.position.x, transform.position.y);
touch0 = Input.GetTouch(0).position - pos;
touch1 = Input.GetTouch(1).position - pos;
zoomCenter = (touch0 + touch1) / 2;
distance = Vector2.Distance(touch0, touch1);
if(lastZoomDistance == float.PositiveInfinity) {
lastZoomDistance = distance;
} else {
if(distance > lastZoomDistance && camera.orthographicSize + zoomSpeed <= maxZoomOut) {
this.camera.orthographicSize = this.camera.orthographicSize + zoomSpeed;
// Assuming script is attached to camera - otherwise, change the transform.position to the camera object
transform.position = Vector3.Lerp(transform.position, zoomCenter, Time.deltaTime);
} else if(distance < lastZoomDistance && camera.orthographicSize - zoomSpeed >= maxZoomIn) {
this.camera.orthographicSize = this.camera.orthographicSize - zoomSpeed;
transform.position = Vector3.Lerp(transform.position, zoomCenter, Time.deltaTime);
}
}
lastZoomDistance = distance;
}
}
カメラのorthographicSize
は、ビューポートの上半分にあるワールド空間単位の数です。0.5 の場合、1 単位の立方体がビューポートを (垂直方向に) 正確に満たします。
したがって、ターゲット領域にズームインするには、カメラを中央に置き ((x,y) をターゲットの中心に設定して) orthographicSize
、領域の高さの半分に設定します。
以下は、オブジェクトの範囲を中央に配置してズームする例です。(左マウス ボタンでズーム、「R」でリセット)
public class OrthographicZoom : MonoBehaviour
{
private Vector3 defaultCenter;
private float defaultHeight; // height of orthographic viewport in world units
private void Start()
{
defaultCenter = camera.transform.position;
defaultHeight = 2f*camera.orthographicSize;
}
private void Update()
{
if (Input.GetMouseButtonDown(0))
{
Collider target = GetTarget();
if(target != null)
OrthoZoom(target.bounds.center, target.bounds.size.y); // Could directly set orthographicSize = bounds.extents.y
}
if (Input.GetKeyDown(KeyCode.R))
OrthoZoom(defaultCenter, defaultHeight);
}
private void OrthoZoom(Vector2 center, float regionHeight)
{
camera.transform.position = new Vector3(center.x, center.y, defaultCenter.z);
camera.orthographicSize = regionHeight/2f;
}
private Collider GetTarget()
{
var hit = new RaycastHit();
Physics.Raycast(camera.ScreenPointToRay(Input.mousePosition), out hit);
return hit.collider;
}
}