I want to create a spherical sector from a sphere game object whose dimensions (Area) can be modified in real time (runtime) using it’s azimuth and elevation angles.
I tried to create a shader that does so but cannot get any where, all I am doing is distorting the shape of the sphere to a ellipsoid.
Any idea on how to achieve this?
Thanks
Its done. Here is the code
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using UnityEngine;
using UnityEngine.UI;
using UnityEditor.UIElements;
public class Please : MonoBehaviour
{
public int ThetaUpper = 30;
public int ThetaLower = 40;
public int PhiUpper = 30;
public int PhiLower = 10;
public bool edit = true;
private int ThetaU;
private int ThetaL;
private int PhiU;
private int PhiL;
public float size = 0.001f;
private readonly int res = 2;
private Mesh mesh;
private MeshFilter meshFilter;
public float radius = 5.0f;
private GameObject[] points;
private Vector3[] vertices;
// Start is called before the first frame update
void Start()
{
this.gameObject.AddComponent<MeshFilter>();
this.gameObject.AddComponent<MeshRenderer>();
meshFilter = this.gameObject.GetComponent<MeshFilter>();
meshFilter.sharedMesh = new Mesh();
mesh = meshFilter.sharedMesh;
Create();
Assign();
}
bool check()
{
if (ThetaLower == ThetaL && ThetaUpper == ThetaU && PhiLower == PhiL && PhiUpper == PhiU)
return true;
else return false;
}
void Assign()
{
ThetaU = ThetaUpper;
ThetaL = ThetaLower;
PhiL = PhiLower;
PhiU = PhiUpper;
}
void Create()
{
int index1 = (ThetaLower - ThetaUpper) * 2;
int index2 = (PhiUpper - PhiLower) * 2;
vertices = new Vector3[index1 * index2];
int[,] temp = new int[index1, index2];
int no = 0;
for (int i = 0; i < index1; i++)
{
float theta = ((0.5f * i) + ThetaUpper) * Mathf.Deg2Rad;
for (int j = 0; j < index2; j++, no++)
{
float phi = ((0.5f * j) + PhiLower) * Mathf.Deg2Rad;
float x = radius * Mathf.Sin(theta) * Mathf.Cos(phi);
float z = radius * Mathf.Sin(theta) * Mathf.Sin(phi);
float y = radius * Mathf.Cos(theta);
vertices[no] = new Vector3(x, y, z);
temp[i, j] = no;
}
}
int[] triangles = new int[(index1 - 1) * (index2 - 1) * 6];
int triIndex = 0;
for (int i = 0; i < index1-1; i++)
{
for (int j = 0; j < index2-1; j++)
{
triangles[triIndex] = temp[i, j];
triangles[triIndex + 1] = temp[i + 1, j + 1];
triangles[triIndex + 2] = temp[i, j + 1];
triangles[triIndex + 3] = temp[i, j];
triangles[triIndex + 4] = temp[i + 1, j];
triangles[triIndex + 5] = temp[i + 1, j + 1];
triIndex += 6;
}
}
mesh.Clear();
mesh.vertices = vertices;
mesh.triangles = triangles;
mesh.RecalculateNormals();
}
}
This Works
FlyVC
February 29, 2024, 8:19pm
3
Hello @LionWare I have exactly the same problem, however the sphere does not render any visible segments when using your solution.
When I select it in the scene view I can see that it creates the segments, but even when I assign a material to it, it stays invisible.
Do you have any further instructions on how to use the script?