AddTreeInstance не устанавливает дерево в указанную позицию

Общие вопросы о Unity3D

AddTreeInstance не устанавливает дерево в указанную позицию

Сообщение vva 18 фев 2012, 13:19

Terrain.AddTreeInstance не устанавливает дерево в указанную позицию! почему?
новая сцена:
- камера
- свет
- земля

к земле добавил стандартное дерево "пальму".

установил скрипты.
для камеры(вешаем на камеру)
Синтаксис:
Используется csharp

using UnityEngine;
using System.Collections;

/// <summary>
/// камера
/// </summary>
public class _Camera : MonoBehaviour
{
    //камера
    float rotationY = 0F;
    float sensitivityX = 15F;
    float sensitivityY = 15F;
    float minimumY = -60F;
    float maximumY = 60F;
    //------------------------------------------------

    // Use this for initialization
    void Start()
    {

    } //------------------------------------------------
    //гуи
    void OnGUI()
    {
        if (Camera.mainCamera != null)
        {
            Transform pTransform = Camera.mainCamera.transform;
            Vector3 pPos = pTransform.position;
            GUI.Button(new Rect(10, 10, 200, 20), "Cam=" + pPos.ToString());
        }
    } //------------------------------------------------
    // Update is called once per frame
    void Update()
    {

    } //------------------------------------------------
    //
    void LateUpdate()
    {
        //управление камерой
        _Management_Cam();
    } //------------------------------------------------

    //------------------------------------------------

    //управление камерой
    void _Management_Cam()
    {
        if (Camera.mainCamera == null)
            return;
        Transform pTransform = Camera.mainCamera.transform;
        float pTrSpeed = 10;
        float pRotSpeed = 35;
        bool pbMouse = false;
        float pd = Time.deltaTime;
        float pTr_X = 0;
        float pTr_Y = 0;
        float pTr_Z = 0;
        bool pbTr = false;
        float pRot_X = 0;
        float pRot_Y = 0;
        float pRot_Z = 0;
        bool pbRot = false;

        if (Input.GetMouseButton(1))
        {
            pbMouse = true;
            float rotationX = pTransform.localEulerAngles.y
                + Input.GetAxis("Mouse X") * sensitivityX;
            rotationY += Input.GetAxis("Mouse Y") * sensitivityY;
            rotationY = Mathf.Clamp(rotationY, minimumY, maximumY);
            pTransform.localEulerAngles =
                new Vector3(-rotationY, rotationX, 0);
        }
        //перемещение без изменения высоты
        if (Input.GetMouseButton(2))
        {
            //Set_DrawTextInfo("Camera_Management_Mouse_2", 0);
            pTr_Z += (pTrSpeed * pd);
            pTr_X += (pTrSpeed * pd);
            Vector3 pvF = pTransform.forward;
            Vector3 pvPos = pTransform.position;
            pTrSpeed *= 2;
            pvPos.x += pvF.x * (pTrSpeed * pd);
            pvPos.z += pvF.z * (pTrSpeed * pd);
            pTransform.position = pvPos;
            //pTransform.Translate(pTr_X, pTr_Y, pTr_Z);
            return;
        }
        float pm = Input.GetAxis("Mouse ScrollWheel");
        if (pm != 0)
        {
            pTransform.Translate(0, 0, pm * pTrSpeed);
            pbMouse = true;
        }
        if (pbMouse)
        {
            //Set_DrawTextInfo("Camera_Management_Mouse", 0);
            return;
        }

        //Set_DrawTextInfo("Camera_Management", 0);


        //поворот лево-право
        if (Input.GetKey(KeyCode.Keypad7))
        {
            pRot_Y += (-pRotSpeed * pd);
            pbRot = true;
        }
        else
        {
            if (Input.GetKey(KeyCode.Keypad9))
            {
                pRot_Y += (pRotSpeed * pd);
                pbRot = true;
            }
        }
        //поворот вниз-вверх
        if (Input.GetKey(KeyCode.Keypad1))
        {
            pRot_X += (pRotSpeed * pd);
            pbRot = true;
        }
        else
        {
            if (Input.GetKey(KeyCode.Keypad2))
            {
                pRot_X += (-pRotSpeed * pd);
                pbRot = true;
            }
        }
        //поворот вбок лево-право
        if (Input.GetKey(KeyCode.Keypad0))
        {
            pRot_Z += (pRotSpeed * pd);
            pbRot = true;
        }
        else
        {
            if (Input.GetKey(KeyCode.Keypad3))
            {
                pRot_Z += (-pRotSpeed * pd);
                pbRot = true;
            }
        }

        if (pbRot)
        {
            pTransform.Rotate(pRot_X, pRot_Y, pRot_Z);
        }

        //вперёд-назад
        if (Input.GetKey(KeyCode.Keypad8))
        {
            //Set_DrawTextInfo ("Camera_Keypad8", 0);
            //pTransform.Translate(0,0,1 * pd);
            pTr_Z += (pTrSpeed * pd);
            pbTr = true;
        }
        else
        {
            if (Input.GetKey(KeyCode.Keypad5))
            {
                pTr_Z += (-pTrSpeed * pd);
                pbTr = true;
            }
        }
        //боком лево-право
        if (Input.GetKey(KeyCode.Keypad6))
        {
            pTr_X += (pTrSpeed * pd);
            pbTr = true;
        }
        else
        {
            if (Input.GetKey(KeyCode.Keypad4))
            {
                pTr_X += (-pTrSpeed * pd);
                pbTr = true;
            }
        }
        //вверх-вниз
        if (Input.GetKey(KeyCode.KeypadPlus))
        {
            pTr_Y += (pTrSpeed * pd);
            pbTr = true;
        }
        else
        {
            if (Input.GetKey(KeyCode.KeypadMinus))
            {
                pTr_Y += (-pTrSpeed * pd);
                pbTr = true;
            }
        }

        if (pbTr)
        {
            pTransform.Translate(pTr_X, pTr_Y, pTr_Z);
        }

    } //------------------------------------------------

} //------------------------------------------------
 


для деревьев(вешаем на землю)
Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;

/// <summary>
/// деревья
/// </summary>
public class _Tree : MonoBehaviour
{

    // Use this for initialization
    void Start()
    {
        //очистка деревьев
        _TreeZero();

        //рождение деревьев
        _TreeCreate(0, new Vector3(10, -1, 10), Color.white, Color.white, 1, 1);
        //рождение деревьев
        _TreeCreate(0, new Vector3(1000, 100, 1000), Color.white, Color.white, 1, 1);
    } //------------------------------------------------

    // Update is called once per frame
    void Update()
    {
        bool pbClick = false;
        if (Input.GetKey(KeyCode.LeftShift))
        {
            if (Input.GetMouseButtonUp(0))
            {
                pbClick = true;
            }
        }
        //
        if (pbClick)
        {
            LayerMask pMask = 0;
            float pRayLength = 100;
            Ray pRay = Camera.mainCamera.ScreenPointToRay(Input.mousePosition);
            int pLayer = F_Layer("Default");
            pMask |= 1 << pLayer;
            Vector3 pPosP = F_PointFocusMouse(pRay, pRayLength, pMask);
            Debug.Log("+++ pPosP=" + pPosP.ToString());
            if (pPosP != Vector3.zero)
            {
                //рождение деревьев
                _TreeCreate(0, pPosP, Color.white, Color.white, 1, 1);
            }
        }

    } //------------------------------------------------

    //------------------------------------------------

    //очистка деревьев
    void _TreeZero()
    {
        Terrain pTerrain = Terrain.activeTerrain;
        if (pTerrain == null)
        {
            Debug.Log("!!! pTerrain == null");
            return;
        }
        TerrainData pTerrainData = pTerrain.terrainData;
        if (pTerrainData == null)
        {
            Debug.Log("!!! pTerrainData == null");
            return;
        }
        if (pTerrainData.treeInstances == null)
        {
            Debug.Log("!!! pTerrainData.treeInstances == null");
        }
        else
        {
            ArrayList pArrayList = new ArrayList();
            pTerrainData.treeInstances = (TreeInstance[])pArrayList.ToArray(typeof(TreeInstance));
            Debug.Log("+++ pTerrainData.treeInstances_TreeZero");
        }
    } //------------------------------------------------
    //рождение деревьев
    void _TreeCreate(int fIndex, Vector3 fPos, Color fCol, Color fColMap, float fScaleW, float fScaleH)
    {
        int pCPrototype = 0;
        Terrain pTerrain = Terrain.activeTerrain;
        if (pTerrain == null)
        {
            Debug.Log("!!! pTerrain == null");
            return;
        }
        TerrainData pTerrainData = pTerrain.terrainData;
        if (pTerrainData == null)
        {
            Debug.Log("!!! pTerrainData == null");
            return;
        }
        TreePrototype[] pTreePrototype = pTerrainData.treePrototypes;
        if (pTreePrototype == null)
        {
            Debug.Log("!!! pTreePrototype == null");
            return;
        }
        pCPrototype = pTreePrototype.Length;
        if (pCPrototype < 1)
        {
            Debug.Log("!!! pCPrototype < 1");
            return;
        }
        int pIndex = fIndex;
        if (pIndex < 0 || pIndex >= pCPrototype)
        {
            Debug.Log("!!! pIndex < 0 || pIndex >= pCPrototype");
            return;
        }
        //
        Vector3 pPosOb = fPos;
        TreeInstance pTI = new TreeInstance();
        pTI.position = pPosOb;
        pTI.widthScale = fScaleW;
        pTI.heightScale = fScaleH;
        pTI.color = fCol;
        pTI.lightmapColor = fColMap;
        pTI.prototypeIndex = pIndex;
        pTerrain.AddTreeInstance(pTI);
        pTerrain.Flush();

        if (pTerrainData.treeInstances == null)
        {
            Debug.Log("!!! pTerrainData.treeInstances == null");
        }
        else
        {
            int pCTI = pTerrainData.treeInstances.Length;
            if (pCTI > 0)
            {
                TreeInstance pTrIn = pTerrainData.treeInstances[pCTI - 1];
                Vector3 pPosTI = pTrIn.position;
                Debug.Log("+++ pCTI=" + pCTI.ToString() + "/ fPos=" + fPos.ToString() + "/ pPosTI=" + pPosTI.ToString());
                //
                pTrIn.position = new Vector3(fPos.x, pPosTI.y, fPos.z);
            }
            else
            {
                Debug.Log("!!! pCTI_0");
            }
        }

        Debug.Log("+++ pTerrain_AddTreeInstance_pIndex=" + pIndex.ToString());
    } //------------------------------------------------
    //получить номер слоя по имени
    public static int F_Layer(string fs)
    {
        int pn = LayerMask.NameToLayer(fs);
        return pn;
    } //------------------------------------------------
    //получить точку фокуса мыши
    public static Vector3 F_PointFocusMouse(Ray fRay, float fRayLength, LayerMask fMask)
    {
        Vector3 pV = Vector3.zero;
        Ray pRay = fRay;
        RaycastHit pHit;
        float pRayLength = fRayLength;
        LayerMask pMask = fMask;
        if (Physics.Raycast(pRay, out pHit, pRayLength, pMask.value))
        {
            pV = pHit.point;
        }
        return pV;
    } //------------------------------------------------
} //------------------------------------------------
 


все деревья создаются в одной позиции.
по TreeInstance.position = (1.0, 0.0, 1.0)
но по земле = (2000.0, 0.0, 2000.0)

что я делаю не правильно и как правильно создавать деревья?
vva
UNITрон
 
Сообщения: 215
Зарегистрирован: 16 мар 2011, 22:22
Откуда: планета земля
Skype: vvavvavva3
  • Сайт

Re: AddTreeInstance не устанавливает дерево в указанную позицию

Сообщение waruiyume 18 фев 2012, 13:56

Позиция дерева должна быть нормализованной, всё, что меньше 0 или больше 1- встанет в крайнюю возможную позицию.
Аватара пользователя
waruiyume
Адепт
 
Сообщения: 6143
Зарегистрирован: 30 окт 2010, 05:03
Откуда: Ростов на Дону

Re: AddTreeInstance не устанавливает дерево в указанную позицию

Сообщение vva 18 фев 2012, 15:30

waruiyume писал(а):Позиция дерева должна быть нормализованной, всё, что меньше 0 или больше 1- встанет в крайнюю возможную позицию.

спс. кажись терь всё правильно. по высоте похоже терайн сам определяет позицию.
Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;

/// <summary>
/// деревья
/// </summary>
public class _Tree : MonoBehaviour
{
    float m_TerrainLevel = 1; //высота земли

    //------------------------------------------------

    // Use this for initialization
    void Start()
    {
        //очистка деревьев
        _TreeZero();
        //устанавливаем высоту земли
        _Model();

       /* //рождение деревьев
        _TreeCreate(0, new Vector3(10, 0.01f, 10), Color.white, Color.white, 1, 1);
        //рождение деревьев
        _TreeCreate(0, new Vector3(10, 0, 100), Color.white, Color.white, 1, 1);*/

    } //------------------------------------------------

    // Update is called once per frame
    void Update()
    {
        bool pbClick = false;
        if (Input.GetKey(KeyCode.LeftShift))
        {
            if (Input.GetMouseButtonUp(0))
            {
                pbClick = true;
            }
        }
        //
        if (pbClick)
        {
            LayerMask pMask = 0;
            float pRayLength = 100;
            Ray pRay = Camera.mainCamera.ScreenPointToRay(Input.mousePosition);
            int pLayer = F_Layer("Default");
            pMask |= 1 << pLayer;
            Vector3 pPosP = F_PointFocusMouse(pRay, pRayLength, pMask);
            Debug.Log("+++ pPosP=" + pPosP.ToString());
            if (pPosP != Vector3.zero)
            {
                //рождение деревьев
                _TreeCreate(0, pPosP, Color.white, Color.white, 1, 1);
            }
        }

    } //------------------------------------------------

    //------------------------------------------------

    //очистка деревьев
    void _TreeZero()
    {
        Terrain pTerrain = Terrain.activeTerrain;
        if (pTerrain == null)
        {
            Debug.Log("!!! pTerrain == null");
            return;
        }
        TerrainData pTerrainData = pTerrain.terrainData;
        if (pTerrainData == null)
        {
            Debug.Log("!!! pTerrainData == null");
            return;
        }
        if (pTerrainData.treeInstances == null)
        {
            Debug.Log("!!! pTerrainData.treeInstances == null");
        }
        else
        {
            ArrayList pArrayList = new ArrayList();
            pTerrainData.treeInstances = (TreeInstance[])pArrayList.ToArray(typeof(TreeInstance));
            Debug.Log("+++ pTerrainData.treeInstances_TreeZero");
        }
    } //------------------------------------------------
    //рождение деревьев
    void _TreeCreate(int fIndex, Vector3 fPos, Color fCol, Color fColMap, float fScaleW, float fScaleH)
    {
        int pCPrototype = 0;
        Terrain pTerrain = Terrain.activeTerrain;
        if (pTerrain == null)
        {
            Debug.Log("!!! pTerrain == null");
            return;
        }
        TerrainData pTerrainData = pTerrain.terrainData;
        if (pTerrainData == null)
        {
            Debug.Log("!!! pTerrainData == null");
            return;
        }
        TreePrototype[] pTreePrototype = pTerrainData.treePrototypes;
        if (pTreePrototype == null)
        {
            Debug.Log("!!! pTreePrototype == null");
            return;
        }
        pCPrototype = pTreePrototype.Length;
        if (pCPrototype < 1)
        {
            Debug.Log("!!! pCPrototype < 1");
            return;
        }
        int pIndex = fIndex;
        if (pIndex < 0 || pIndex >= pCPrototype)
        {
            Debug.Log("!!! pIndex < 0 || pIndex >= pCPrototype");
            return;
        }
        //
        Vector3 pPosOb = fPos;
        float pSizeTer_W = pTerrainData.detailWidth;
        float pSizeTer_H = pTerrainData.detailHeight;
        Vector3 pSizeTer = pTerrainData.size;
        Debug.Log("+++ pSizeTer_W=" + pSizeTer_W.ToString() + "/ pSizeTer_H=" + pSizeTer_H.ToString() + "/ pSizeTer=" + pSizeTer.ToString());
        float pX = (1 / pSizeTer.x) * fPos.x;
        float pZ = (1 / pSizeTer.z) * fPos.z;
        float pY = 0;
        pPosOb = new Vector3(pX, pY, pZ);
        TreeInstance pTI = new TreeInstance();
        pTI.position = pPosOb;
        pTI.widthScale = fScaleW;
        pTI.heightScale = fScaleH;
        pTI.color = fCol;
        pTI.lightmapColor = fColMap;
        pTI.prototypeIndex = pIndex;
        pTerrain.AddTreeInstance(pTI);
        pTerrain.Flush();

        if (pTerrainData.treeInstances == null)
        {
            Debug.Log("!!! pTerrainData.treeInstances == null");
        }
        else
        {
            int pCTI = pTerrainData.treeInstances.Length;
            if (pCTI > 0)
            {
                TreeInstance pTrIn = pTerrainData.treeInstances[pCTI - 1];
                Vector3 pPosTI = pTrIn.position;
                Debug.Log("+++ pCTI=" + pCTI.ToString() + "/ fPos=" + fPos.ToString() + "/ pPosTI=" + pPosTI.ToString());
                //
                pTrIn.position = new Vector3(fPos.x, pPosTI.y, fPos.z);
            }
            else
            {
                Debug.Log("!!! pCTI_0");
            }
        }

        Debug.Log("+++ pTerrain_AddTreeInstance_pIndex=" + pIndex.ToString());
    } //------------------------------------------------
    //получить номер слоя по имени
    public static int F_Layer(string fs)
    {
        int pn = LayerMask.NameToLayer(fs);
        return pn;
    } //------------------------------------------------
    //получить точку фокуса мыши
    public static Vector3 F_PointFocusMouse(Ray fRay, float fRayLength, LayerMask fMask)
    {
        Vector3 pV = Vector3.zero;
        Ray pRay = fRay;
        RaycastHit pHit;
        float pRayLength = fRayLength;
        LayerMask pMask = fMask;
        if (Physics.Raycast(pRay, out pHit, pRayLength, pMask.value))
        {
            pV = pHit.point;
        }
        return pV;
    } //------------------------------------------------
    //устанавливаем высоту земли
    void _Model()
    {
        Terrain pTerrain = Terrain.activeTerrain;
        TerrainData pTerrainData = pTerrain.terrainData;
        if (pTerrain == null || pTerrainData == null) return;
        Vector3 pTDScale = pTerrainData.heightmapScale;
        int pnW = pTerrainData.heightmapWidth;
        int pnH = pTerrainData.heightmapHeight;
        float[,] pAr = pTerrainData.GetHeights(0, 0, pnW, pnH);
        float pLev = m_TerrainLevel;
        if (pTDScale.y > 0) pLev = pLev / pTDScale.y;
        //устанавливаем высоту земли
        for (int n = 0; n < pnW; n++)
        {
            for (int n1 = 0; n1 < pnH; n1++)
            {
                pAr[n, n1] = pLev;
            }
        }
        pTerrainData.SetHeights(0, 0, pAr);
    } //------------------------------------------------
} //------------------------------------------------
 
vva
UNITрон
 
Сообщения: 215
Зарегистрирован: 16 мар 2011, 22:22
Откуда: планета земля
Skype: vvavvavva3
  • Сайт


Вернуться в Общие вопросы

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 10