Unity3D 实现类似“纪念碑谷”扭曲物体的效果


纪念碑谷,示例图片:






需要注意的是:FBX 导入新工程 File Scale会缩小,需要放大 Scale Factor

需要使用特殊的MeshFilter材质。
下载地址:http://pan.baidu.com/s/1jIbnQfG


代码如下:


using UnityEngine;
using System.Collections;
using System;
public class TwistScript : MonoBehaviour {
    public float twist = 1.0f;
    public float inputSensitivity = 1.5f;
    private Vector3[] baseVertices;
    private Vector3[] baseNormals;
    private Vector3 new_pos;
       // Update is called once per frame
       void Update () {
        twist += Input.GetAxis("Horizontal") * inputSensitivity * Time.deltaTime;
        //限制扭曲范围
        if (twist < -2)
        {
            twist = -2;
        }
        if (twist > 2)
        {
            twist = 2;
        }
        Mesh mesh = GetComponent<MeshFilter>().mesh;
        if (baseVertices == null)
        {
            baseVertices = mesh.vertices;
        }
        if (baseNormals == null)
        {
            baseNormals = mesh.normals;
        }
        Vector3[] vertices = new Vector3[baseVertices.Length];
        Vector3[] normals = new Vector3[baseNormals.Length];
        for (int i = 0; i < vertices.Length; i++)
        {
            vertices[i] = DoTwist(baseVertices[i], baseVertices[i].y * twist);
            normals[i] = DoTwist(baseNormals[i], baseVertices[i].y * twist);
        }
        mesh.vertices = vertices;
        mesh.normals = vertices;
        mesh.RecalculateNormals();
        mesh.RecalculateBounds();
    }
    //产生扭曲
     private Vector3 DoTwist(Vector3 pos, float t)
    {
        float st = Mathf.Sin(t);
        float ct = Mathf.Cos(t);
        new_pos = Vector3.zero;
        new_pos.x = pos.x * ct - pos.z * st;
        new_pos.z = pos.x * st + pos.z * ct;
        new_pos.y = pos.y;
        return new_pos;
    }
}



效果如下图所示:








  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值