Поиск сообщества
Показаны результаты для тегов '3D'.
Найдено: 13 результатов
-
Здравствуйте. Для проекта понадобилось мышью перемещать TSphere по линии, нарисованной с помощью Drawline. Не подскажите, как можно реализовать такое движение строго вдоль линии. Хотя, был бы благодарен если бы помогли понять обычное движение 3d объектов. Заранее спасибо.
-
Здравствуйте, для проекта понадобилось рисовать линии в 3d графике, но возникла такая проблема, можете подсказать, что не так? Вот часть кода procedure TForm2.Sphere1Render(Sender: TObject; Context: TContext3D); var v1,v2:TPoint3D; begin if Context.BeginScene then try v1:=TPoint3D.Create(Sphere1.Position.X,Sphere1.Position.Y,Sphere1.Position.Z); v2:=TPoint3D.Create(Sphere2.Position.X,Sphere2.Position.Y,Sphere2.Position.Z); Context.drawline(v1,v2,1,TAlphaColorRec.Black); finally Context.EndScene; end; end; На изображении результат работы программы.
-
Здравствуйте. Может кто из форумчан подскажет, как реализовать сабж. Нашла видео на ютубе, но там перемещение сферы по объекту Plane. А как реализовать перемещение по всей сцене? Допустим на сцене есть только один объект TCube, как его переместить мышкой в нужную позицию?
- 2 ответа
-
- 3d
- tcontrol3d
-
(и ещё 1 )
C тегом:
-
Привет всем! Кто-нибудь сталкивался с проблемой запуска приложения с использованием 3D компонентов на Android эмуляторе? Приложение написано на Delphi. На iOS эмуляторе всё в порядке - запускается и работает без проблем, а вот Android эмуляторе не хочет. Точнее приложение только начинает запускаться и эмулятор падает. Подчёркиваю - не приложение а сам эмулятор падает! Если убрать 3D компоненты, то всё будет нормально работать, но стоит только добавить хотя бы один 3D компонент, то всё... Delphi 10 Seattle, Android API 22 для 5.1.1. Такое же было и на прежних версиях студии - XE7, XE8. Решение не находил и забивал, т.к. под Android приложение не требовалось - чисто для интереса пробовал запустить, а сейчас потребовалось. Буду очень благодарен за помощь!
-
Захотелось создать игрушку для дальнейший освоение FM, так как у меня работа связана с дорогами. Каким способ лучше создать дороги, пробовал ректанглам получается какие то не красивые коробки Планируется что то наподобие этого картинки плюс разные разветвление и в некоторых местах узкие или широкие дороги PS. Дорога трехмерная, еще было бы круто создать редактор карт. За ранее спасибо
- 5 ответов
-
- 3D
- FireMonkey
-
(и ещё 3 )
C тегом:
-
Уже создавал тему по этому вопросу, надеялся, что в ХЕ8 рендеринг исправят, но нет. Кроме того, проблема обросла подробностями. Итак, та же моделька того же человечка в шлеме, собрана на TPlane'ах, код текстурирования тот же, всё так же не рендерится голова внутри. В тот раз проблема решилась случайно и я сам не понял, что же именно привело к решению. С тех пор форму старался не трогать, но рано или поздно дошёл и до неё черёд. И как результат, та же проблема - уже в ХЕ8. Подробнее о том, как организована модель: Viewport3D, внутри него лежит TDummy, в котором собрана TPlane'ами модель, а также камера, которая на это безобразие смотрит: Теперь непосредственно к проблеме: Смотрим на скрин: По вайрфреймам можно понять, что боковые плоскости головы не рендерятся вообще (а не пропадает текстурка, как я полагал раньше). Интересно, а что "внутри" шлема? Чтобы узнать, сделал возможность в рантайме, не закрывая программу, "снять" шлем (Visible для всех граней в False). Смотрим: Оп! Все грани на месте, всё отлично прорендерилось! А если снова "надеть" шлем? Нет, надевание шлема привело всё к той же грустной картине на первом скрине - боковые плоскости просто отсеклись и упрямо не хотят рендериться... Следующим шагом попробуем уменьшить прозрачность одной из плоскостей шлема и посмотреть сквозь неё на отсечённую плоскость головы: Так точно, и полупрозрачность не заставляет включаться рендеринг "внутренних" граней. А что будет, если поменять разрядность платформы? Выставим Win64/Debug и - о чудо! - рендеринг внезапно заработал! И под конец экспериментов всплыл не такой страшный, но всё же назойливый баг, из-за которого иногда не прорисовываются те или иные графические элементы: к примеру, здесь не прорисовались текстуры модельки, иногда не прорисовываются некоторые превьюшки списка серверов, но это лечится обновлением битмапа. Итак, что же мы узнали из этих исследований? Ровным счётом ничего. Рендеринг или, наоборот, нерендеринг не имеют никаких закономерностей. Какими способами удалось повлиять на прорисовку этих поверхностей: 1) Изменение целевой платформы (Win32/Win64/Debug/Release) дают разный результат - практически всегда из четырёх комбинаций есть удачная, где всё рендерится 2) Изменение формы - добавление новых элементов или удаление существующих, помогает не всегда. На рабочей конфигурации может наоборот привести к отсечению граней 3) Изменение кода. ЛЮБОЕ. Даже никак не связанное с рендерингом. Достаточно воткнуть в произвольное место что-то типа Inc(Variable), чтобы рендеринг починился. Этого же, впрочем, достаточно и для того, чтобы рендеринг сломался. Что НИКАК не влияет на рендеринг: А не влияет всё то, что должно было бы повлиять, а именно: 1) Расстановка в любых мыслимых и немыслимых местах BeginUpdate'ов и EndUpdate'ов 2) Repaint'ы и Invalidate'ы всего и вся 3) Обновление текстур (грубо говоря, заливка модели новой текстурой) 4) Использование StyleBook'a Исходя из вайрфреймов, нарисованных на каждой плоскости, мы видим, что не прорисовываются сами TPlane'ы. Могу предположить, что движок считает их невидимыми и отсекает как ненужные для оптимизации, но почему, в таком случае, рендерятся передняя и задняя плоскости головы? Итак, вопрос - классика: кто виноват и что делать. Баг ли это в движке FMX, или же всё учтено и достаточно задать волшебную опцию, которая разом всё починит - я так и не узнал. Приветствуется любая помощь, а также хотелось бы раз и навсегда закрыть вопрос: в каких случаях нужно делать BeginUpdate/EndUpdate и влияет ли он на обработку отрисовки унаследованных объектов.
-
Как создавать(ну и удалять,изменять) примитивные 3D фигуры (например Rectangle3D, Cube, Sphere ...) в runtime-ме в большом количестве. То есть я не знаю сколько мне надо фигур заранее. За ранее СПАСИБО
-
Доброе время суток! Подскажите, возможно ли принципиально как-то организовать генерацию частиц? Создать имитацию огня, например? Или с FireMonkey можно и не пытаться?
- 3 ответа
-
- Генерация частиц
- Particles
-
(и ещё 2 )
C тегом:
-
Есть моделька человека, собранная из TPlane'ов, на голове - шлем, на шлем накладывается текстура с прозрачными пикселями. Модельку можно вращать. Если подключить StyleBook, то голова перестаёт прорисовываться сквозь прозрачные пиксели при вращении. Запустили приложение, голова прорисована: Поворачиваем - голова мгновенно "стирается": Отключаем StyleBook - крутим модельку, всё хорошо: Как исправить рендеринг сквозь прозрачные пиксели? P.S.: Если в StyleBook'e поставить галочку на UseStyleManager, то снова всё отрисовывается нормально, но использовать StyleManager очень неудобно. Код текстурирования // Скопировать часть битмапа в другой битмап: procedure CopyBitmapToBitmap( const SrcBitmap : FMX.Graphics.TBitmap; // Из какого битмапа копируем const DestBitmap : FMX.Graphics.TBitmap; // В какой битмап копируем const SrcRect : TRectF; // Какой прямоугольник const DstRect : TRectF; // В какой прямоугольник ScaleCoeff : Single = 1.0; // Коэффициент масштабирования (DstRect * ScaleCoeff) Opacity : Single = 1.0; // Коэффициент прозрачности накладываемого изображения FlushBeforeDrawing : Boolean = True; // Очищать ли предыдущее содержимое Interpolate : Boolean = False // Интерполировать ли при масштабировании ); function Max(const A, B: Single): Single; inline; begin if A > B then Result := A else Result := B; end; begin if FlushBeforeDrawing then DestBitmap.Clear($00000000); DestBitmap.SetSize(Round(Max(DstRect.Left, DstRect.Right) * ScaleCoeff), Round(Max(DstRect.Top, DstRect.Bottom) * ScaleCoeff)); DestBitmap.Canvas.BeginScene; DestBitmap.Canvas.DrawBitmap( SrcBitmap, SrcRect, RectF( DstRect.Left, DstRect.Top, DstRect.Left + ((DstRect.Right - DstRect.Left) * ScaleCoeff), DstRect.Top + ((DstRect.Bottom - DstRect.Top) * ScaleCoeff) ), Opacity, not Interpolate ); DestBitmap.Canvas.EndScene; end; // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - procedure TMainForm.DrawSkin(FileStream: TMemoryStream); type TTextureInfo = array of Integer; // OffsetX, OffsetY, Width, Height TCubeTexture = array of TTextureInfo; // Front, Back, Left, Right, Top, Bottom TSurfaceArray = array of ^TPlane; // Индексы элементов в массивах: const iOffsetX = 0; iOffsetY = 1; iWidth = 2; iHeight = 3; iFront = 0; iBack = 1; iLeft = 2; iRight = 3; iTop = 4; iBottom = 5; iHead = 0; iTorso = 1; iLeftArm = 2; iRightArm = 3; iLeftLeg = 4; iRightLeg = 5; iHelmet = 6; const HeadTexture : TCubeTexture = [// X Y W H [8 , 8, 8, 8], // Front [24, 8, 8, 8], // Back [0 , 8, 8, 8], // Left [16, 8, 8, 8], // Right [8 , 0, 8, 8], // Top [16, 0, 8, 8] // Bottom ]; ... { здесь пропущен список координат для каждой текстуры из битмапа } ... const ScaleCoeff: Single = 16.0; var Bitmap: FMX.Graphics.TBitmap; // Список поверхностей каждой части модели: HeadPlanes : TSurfaceArray; TorsoPlanes : TSurfaceArray; LeftArmPlanes : TSurfaceArray; RightArmPlanes : TSurfaceArray; LeftLegPlanes : TSurfaceArray; RightLegPlanes : TSurfaceArray; HelmetPlanes : TSurfaceArray; // Список частей модели: ModelParts: array of ^TSurfaceArray; // Список текстур каждой части модели: ObjectTextures: array of ^TCubeTexture; // I - счётчик по частям модели, J - счётчик по поверхностям: I, J: LongWord; begin // Загружаем битмап из PNG-файла: Bitmap := FMX.Graphics.TBitmap.Create; Bitmap.LoadFromStream(FileStream); // Составляем массив из групп текстур для каждой части модели: ObjectTextures := [@HeadTexture, @TorsoTexture, @LeftArmTexture, @RightArmTexture, @LeftLegTexture, @RightLegTexture, @HelmetTexture]; // Составляем список поверхностей: HeadPlanes := [@HeadFront , @HeadBack , @HeadLeft , @HeadRight , @HeadTop , @HeadBottom ]; TorsoPlanes := [@TorsoFront , @TorsoBack , @TorsoLeft , @TorsoRight , @TorsoTop , @TorsoBottom ]; LeftArmPlanes := [@LeftArmFront , @LeftArmBack , @LeftArmLeft , @LeftArmRight , @LeftArmTop , @LeftArmBottom ]; RightArmPlanes := [@RightArmFront, @RightArmBack, @RightArmLeft, @RightArmRight, @RightArmTop, @RightArmBottom]; LeftLegPlanes := [@LeftLegFront , @LeftLegBack , @LeftLegLeft , @LeftLegRight , @LeftLegTop , @LeftLegBottom ]; RightLegPlanes := [@RightLegFront, @RightLegBack, @RightLegLeft, @RightLegRight, @RightLegTop, @RightLegBottom]; HelmetPlanes := [@HelmetFront , @HelmetBack , @HelmetLeft , @HelmetRight , @HelmetTop , @HelmetBottom ]; // Составляем список частей модели: ModelParts := [@HeadPlanes, @TorsoPlanes, @LeftArmPlanes, @RightArmPlanes, @LeftLegPlanes, @RightLegPlanes, @HelmetPlanes]; // Проходимся по каждой части модели (голова, корпус, ...): for I := 0 to High(ModelParts) do begin // Проходимся по каждой поверхности модели: for J := 0 to High(ModelParts[I]^) do begin // Рисуем текстуру на каждой поверхности: with (ModelParts[I]^)[J]^ do begin CopyBitmapToBitmap( Bitmap, TTextureMaterialSource(MaterialSource).Texture, RectF( (ObjectTextures[I]^)[J][iOffsetX], (ObjectTextures[I]^)[J][iOffsetY], (ObjectTextures[I]^)[J][iOffsetX] + (ObjectTextures[I]^)[J][iWidth], (ObjectTextures[I]^)[J][iOffsetY] + (ObjectTextures[I]^)[J][iHeight] ), RectF(0, 0, (ObjectTextures[I]^)[J][iWidth], (ObjectTextures[I]^)[J][iHeight]), ScaleCoeff ); // Инвертируем текстуры для симметрии: if I in [iLeftArm, iLeftLeg] then TTextureMaterialSource(MaterialSource).Texture.FlipHorizontal; end; end; end; FreeAndNil(Bitmap); end;
-
К примеру у меня есть объекты TSphere, TCylinder, а также TModel3D, все эти объекты находятся в движении, соответственно могут пересечься. Вопрос в том, как определить факт их пересечения? В 2D, например в TImage, когда объекты рисуются вручную, там выбирать не приходиться, просчитываешь всё сам, но тут даже не 2D шейпы, а 3D, и я предположил, что есть какой-то более простой способ просчёта пересечений. Может быть есть какое-то явное сравнение двух множеств точек на которых находятся два объекта, и если они пересеклись (булево пересечение), то можно запустить какой-то кусок кода? Подскажите пожалуйста способы определения пересечения 3D объектов.
-
Можно ли реализовать эффект перелистывания листов книги при смене табов в табконтрол? Пробовал реализовать в 3D приложении. На Layer3D кидал табконтрол и свойство Layer3D->RotationAngle->Y привязывал к FloatAnimation->StopValue=360 Но получается не красиво - делается два оборота,- может есть возможность полностью перевернуть табконтрол на 360о , в идеале табитем,за один поворот 180о ? Если кто смотрел на андроиде NextLauncher, в нем можно поставить эффект перелистывания рабочих столов Ткань, что-то типа такого я хочу реализовать Вот, только ето сильно крутой эффект, меня устроит и простое прямоугольное перелистывание , желательно итемов табконтрола но устроит и вариант смена итема и переворот всего табконтрола RotationAngle->Y подходит, но из за того что происходит двойной переворот табконтрола и визуально ето не красиво, а реализовать переворот на 360 в одном перевороте пока не выходит Заранее спасибо