Ну делаю то на юнити, я просто не очень прошарил еще ее, как это сделать ? В центре камера , вокруг нее цилиндр получается на которой нацеплены контролы. и вот юзер получается что вокруг юзера куча контролов. Так получается.
timur2008, Просто сделать кучу канвасов и разместить их в форме цилиндра. Его остатки и на хлеб не намазать. Мой тебе совет Пабло - относись к жизни как к веселухе, но непродолжительной. @Эш
Извиняюсь да я так и сделал , но это не очень работает т.к. я пишу приложуху для VR используя Fibrum SDK и судя по всему там ограничение есть использовать только один Canvas . Полукругом не получится т.к. у мозга юзера должно создастся впечатление что эти компоненты вокруг него.
timur2008, Тогда сделай все элементы на канвасе невидимым, создай второй канвас с видимыми элементами. Привяжи функции элементов второго канваса к нажатию на элементах первого. Возьми камеру которая записывает raw текстуры. Снимай ею второй канвас с визуальными элементами. RawТекстуру нацепи на изогнутый объект и помести его перед первым канвасом. Но этот вариант требует хирургической точности.
А если серьезно, то множество канвасов это и есть ответ на твой вопрос. Его остатки и на хлеб не намазать. Мой тебе совет Пабло - относись к жизни как к веселухе, но непродолжительной. @Эш
Сообщение отредактировал Barbatos - Пятница, 20 Мая 2016, 14:55
timur2008, а что значит в виде цилиндра - значит полукругом. Можно координату Z приплюснуть, но сейчас не об этом. Поищите способ выдернуть из canvas его рендер(материал, текстурку или ещё что-то), сделайте модель этого самого полуцилиндра, воткните в него эту текстуру, приделайте триггеры на места элементов и радуйтесь. Ещё вариант, откуда взять текстуру - выкинуть UI и рисовать вручную)
Другой вариант: Нашёл в справке UIVertex, думаю ясно зачем он) UI рендерится аналогично, как 3д модель(так можно сделать), можно попробовать покопаться в справке, найти всю нужную инфу по изменению вертексов и далее вас ждёт математика)
Добавлено (20 мая 2016, 16:55) --------------------------------------------- Немного покапал в этом направлении. Используйте BaseMeshEffect класс, на его основе можете написать класс, который будет автоматически изгибать элементы на Canvas, как вам надо, причём, каждый по отдельности) Работает, как компонент
Сообщение отредактировал ShortKedr - Пятница, 20 Мая 2016, 16:55
Lertmind, вопрос, собственно стоял в том, что бы погнуть canvas и его содержимое. Для этого: решение BaseMeshEffect. Но, да, можно и 3d mesh'ы тыкнуть, так даже лучше) Если предположить, что мы в старых версиях Юни(где не было UI), то эта задача реализовывалась за счёт 3d mesh'ей, преимущественно.
Добавлено (20 мая 2016, 18:48) ---------------------------------------------
ЦитатаBarbatos ()
А если серьезно, то множество канвасов это и есть ответ на твой вопрос.
Автору нужно скруглить интерфейс
Сообщение отредактировал ShortKedr - Пятница, 20 Мая 2016, 19:29
using UnityEngine; using UnityEngine.UI; using System.Collections; using System.Collections.Generic;
#if UNITY_5_3_OR_NEWER public class TessellationVertexEffect : BaseMeshEffect #else public class TessellationVertexEffect : BaseVertexEffect #endif { #if UNITY_5_3_OR_NEWER public override void ModifyMesh(VertexHelper vh) { if (!IsActive()) return;
List<UIVertex> list = new List<UIVertex>(); for (int i = 0; i < vh.currentVertCount; i++) { var v = new UIVertex(); vh.PopulateUIVertex(ref v, i); list.Add(v); }
ModifyVertices(list);
vh.Clear(); for (int i = 0; i < list.Count; i += 4) { UIVertex[] v = new UIVertex[4] { list[i + 0], list[i + 1], list[i + 2], list[i + 3] }; vh.AddUIVertexQuad(v); } } #endif
public void ModifyVertices(List<UIVertex> verts) { if (verts.Count == 0) { // Nothing to do... return; }
// Assume we are getting quads if ((verts.Count % 4) != 0) { Debug.LogError("Modifier expects vertices to be arranged as quads"); return; }
// Tessellate int startingVertexCount = verts.Count; for (int i = 0; i < startingVertexCount; i += 4) { TessellateQuad(verts, i); }
// Remove old quads from the start of the list verts.RemoveRange(0, startingVertexCount); }
// Position deltas, A and B are the local quad up and right axes Vector3 dPdA = v2.position - v1.position; Vector3 dPdB = v1.position - v0.position;
// Determine how many tiles there should be float rcpTessSize = 1.0f / Mathf.Max(1.0f, m_tessellationSize); int aQuads = Mathf.CeilToInt(dPdA.magnitude * rcpTessSize); int bQuads = Mathf.CeilToInt(dPdB.magnitude * rcpTessSize);
// Build the sub quads float rcpAQuads = 1.0f / (float)aQuads; float rcpBQuads = 1.0f / (float)bQuads; float startBProp = 0.0f; for (int b = 0; b < bQuads; ++b) { float endBProp = (float)(b + 1) * rcpBQuads; float startAProp = 0.0f; for (int a = 0; a < aQuads; ++a) { float endAProp = (float)(a + 1) * rcpAQuads;
// Append new quad to list verts.Add(Bilerp(v0, v1, v2, v3, startAProp, startBProp)); verts.Add(Bilerp(v0, v1, v2, v3, startAProp, endBProp)); verts.Add(Bilerp(v0, v1, v2, v3, endAProp, endBProp)); verts.Add(Bilerp(v0, v1, v2, v3, endAProp, startBProp));
Color Bilerp(Color v0, Color v1, Color v2, Color v3, float a, float b) { Color top = Color.Lerp(v1, v2, a); Color bottom = Color.Lerp(v0, v3, a); return Color.Lerp(bottom, top, b); }
Переход основывался на этом, но использую циклы для заполнения, так как GetUIVertexStream и AddUIVertexTriangleStream работают не так, как хотелось бы. Из-за первого метода в общем-то (смотрел исходный код UI), в ShadowEffect появляются лишние 4 вершины на букву, которые можно было избежать (в OutlineEffect ещё больше, так как он состоит из 4 теней от ShadowEffect). В сцене CylinderUI у Canvas стоит Render Mode -> Screen Space, чтобы было в мире - изменяем на World Space.
Добавлено (20 мая 2016, 19:31) --------------------------------------------- ShortKedr, проблема в том, что здесь "ошибка XY". Автор вопроса стал решать задачу не тем методом.
Сообщение отредактировал Lertmind - Пятница, 20 Мая 2016, 19:24
Скажу ещё... Всем кто является новичком или ещё не использовал такого метода: Попробуйте выстроить логическую цепочку решение вашей проблемы. Допустим вы придумали решение своей проблемы, но не знаете, будет ли оно работать. Попробуйте проанализировать его:
"Куча канвасов или элементы полукругом - выглядит не плохо, но не то, нет эффекта изгиба да и больше 1 canvas на интерфейс - это уже слишком). Идём дальше: дополнительный рендер с помощью камеры и наложение на цилиндрическую модель - уже лучше, но всё равно не то, т.к. лишние затраты на доп. рендер(хоть и не большие) и нужно добавлять кучу триггеров. Точно Canvas же выводится аналогично 3д модели, значит вероятно можно найти способ изменять его mesh, добавить изгиб. Ага, покапался в справке, нашёл UIVertex, нашёл в Unity3d компонент PositionAsUV1, почитал про него в справке, узнал, что он унаследован от BaseMeshEffect, увидел у него метод ModifyMesh, понял - это то что нужно. Исследовал 1-2 странички интернета или поковырялся сам, понял как он работает. Написал компонент изгиба mesh для UI элементов) С удовольствием закончил свою работу над этой задачей - принялся за следующую)"
Сообщение отредактировал ShortKedr - Пятница, 20 Мая 2016, 22:17