Вы можете программно генерировать сетки, как говорят комментарии.
Однако, если угол динамический, то есть часто меняется, это приведет к потере времени ЦП и пропускной способности графического процессора, которые лучше всего потратить на что-то другое. Лучший вариант - смоделировать (или сгенерировать программно при запуске) форму 180 ° или 270 ° и написать вершинный шейдер, чтобы свернуть или свернуть форму вокруг центра.
Для простоты смоделируйте свою форму так, чтобы ось цилиндра была Z, центр XY был {0, 0}
(Z не имеет значения), отверстие формы было направлено к -X
, а форма симметрична вокруг Плоскость Y = 0 Я говорю о локальных координатах объекта, затем вы можете расположить / повернуть модель так, как вы хотите.
Вот код вершинного шейдера (не проверен):
float len = length( float2( position.x, position.y ) );
float newAngle = atan2( position.y, position.x ) * rollFactor;
float3 newPosition = float3( len * cos( newAngle ), len * sin( newAngle ), position.z );
output.position = UnityObjectToClipPos( newPosition );
Таким образом, вам нужно всего лишь обновить одну постоянную переменную rollFactor
, чтобы преобразовать вашу форму под любым углом. Если начальная форма равна 270 °, установите константу 1.33334, чтобы свернуть ее в полный пончик, 1.0, чтобы она оставалась на 270 °, 0.33333, чтобы скатиться до 90 °, как на скриншоте и т. Д.