//********************************** //какой то глюк с позицией планеты, если не в 0.0 то возвращает непонятно что //**************************************** private void setVertices() { camPosition = worldToLocal(cam.transform.position); // позиция камеры magic = Quaternion.FromToRotation(curAxis, camPosition); //определяю магию для плавного нарастания детализации camDistance = Vector3.Magnitude(camPosition); // Mathf.Sqrt(camPosition.x*camPosition.x+camPosition.y*camPosition.y+camPosition.z*camPosition.z); float min = 0.8f; float max = 2.5f; if (camDistance >= 1.75f * radius) { coordCorrection = max; } else { if (camDistance <= radius) { coordCorrection = min; } else { float bebe = Mathf.Pow((camDistance / radius - 0.75f), 0.9f); coordCorrection = Mathf.Lerp(min, max, bebe); } } //ставлю точки float texCoorScale = 200f; for (int i = 0; i < vertOld.Length; i++) { //есть сохраненная позиция в меше которую легко повернуть к камере Vector3 turnedPos = vertOld[i]; turnedPos.x *= coordCorrection; turnedPos.z *= coordCorrection; turnedPos = magic * turnedPos; turnedPos.Normalize(); float height = MagicData.Height(turnedPos); vert[i] = turnedPos * radius * height; Vector3 pos = turnedPos; float xCoor = Mathf.Abs(pos.x); float yCoor = Mathf.Abs(pos.y); float zCoor = Mathf.Abs(pos.z); if (xCoor >= yCoor && xCoor >= zCoor) { uv[i] = new Vector2(pos.y / pos.x, pos.z / pos.x); } if (yCoor > xCoor && yCoor >= zCoor) { uv[i] = new Vector2(pos.x / pos.y, pos.z / pos.y); } if (zCoor > yCoor && zCoor > xCoor) { uv[i] = new Vector2(pos.y / pos.z, pos.x / pos.z); } uv[i] *= texCoorScale; } }
void camHandle() { //запрет на перемещение внутри планеты Vector3 camPosition = ThisMeshPlanet.worldToLocal(transform.position); float camDistance = Vector3.Magnitude(camPosition); float heightAtThisPoint = MagicData.Height(camPosition); Vector3 posit = camPosition; posit.Normalize(); if (camDistance < (posit * heightAtThisPoint * (ThisMeshPlanet.radius + height_of_sight)).magnitude) { transform.position = ThisMeshPlanet.localToWorld(posit * heightAtThisPoint * (ThisMeshPlanet.radius + height_of_sight)); } }
void SetTree(int number, GameObject CurTree) { Vector3 pos = Random.insideUnitSphere; pos.Normalize(); float height = MagicData.Height(pos); //two.Height(pos); if (height > 1) { GameObject currentTree = (GameObject)Instantiate(CurTree); currentTree.transform.parent = gameObject.transform; currentTree.transform.position = pos * (radius) * height; currentTree.transform.up = pos; currentTree.transform.RotateAroundLocal(pos, Random.value * 360); Vector3 scale = new Vector3((0.5f + Random.value * 0.5f), (0.5f + Random.value * 0.5f), (0.5f + Random.value * 0.5f)); currentTree.transform.localScale.Scale(scale); } }