Перейти к содержанию
  • 0
FreeOS

Как создавать примитивные 3D фигуры в runtime

Вопросы

Как создавать(ну и удалять,изменять) примитивные 3D фигуры (например Rectangle3D, Cube, Sphere ...) в runtime-ме в большом количестве.

То есть я не знаю сколько мне надо фигур заранее.

 

За ранее СПАСИБО

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Рекомендуемые сообщения

  • 0

Как вариант:

 

Procedure DrawYou3d(Const Count:Integer);

var

     You3d:Array of TYou3d;

     i:integer;

Begin

    SetLength(You3d, Count);

    for i:=Low(You3d) to High(You3d) do 

    BEGIN

        You3d:=TYou3d.Create(Self);

        You3d.Parent:=YouForm;

    END

End;

 

TYou3d - класс ваших 3д фигур 

YouForm - родитель("на ком" будут лежать они)

(код писал без реальной проверки в студии - если не работает - скажите)

Отредактировал Сысоев Максим

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Как вариант:

 

Procedure DrawYou3d(Const Count:Integer);

var

     You3d:Array of TYou3d;

     i:integer;

Begin

    SetLength(You3d, Count);

    for i:=Low(You3d) to High(You3d) do 

    BEGIN

        You3d:=TYou3d.Create(Self);

        You3d.Parent:=YouForm;

    END

End;

 

TYou3d - класс ваших 3д фигур 

YouForm - родитель("на ком" будут лежать они)

(код писал без реальной проверки в студии - если не работает - скажите)

 

Попробовал вот так 

 

Procedure DrawYou3d(Const Count:Integer);
var
     You3d:Array of TRectangle3D;
     i:integer;
Begin
    SetLength(You3d, Count);
 
    for i:=Low(You3d) to High(You3d) do
    BEGIN
        You3d:=TRectangle3D.Create(self); // вот тут
        You3d.Parent:=Form1;
    END
End;
 
но выводится ошибка в [dcc32 Error] Unit1.pas(34): E2003 Undeclared identifier: 'self'
 
PS так же хотелось бы чтобы фигуры рисовались по очереди, то есть нажал кнопку появился первый еще раз нажал появился второй и т.д.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

1. вместо self - form1, или другой родитель, или nil

По одной? ок. для этого:

1: You3d:Array of TRectangle3D; - переносишь в приват раздел твоей формы(form1=class(tForm) private You3d:Array of TRectangle3D).

2. SetLength(You3d, 0); - в конструкторе инициализируешь массив (вот тут могу врать - возможно это необязательно)

3. Procedure DrawYou3d; - создаешь в Public разделе класса(того же класса где и писал You3d:Array of TRectangle3D)

в реализации метода пишешь:

 

Procedure TYouClass.DrawYou3d;

Begin
    SetLength(You3d, High(You3d)+1);
    You3d[High(You3d)]:=TRectangle3D.Create(self); // вот тут
   You3d[High(You3d)].Parent:=Form1;
End;
 
по желанию(ну или обязательно, тоже не помню) можешь в параметрах процедуры передать позицию фигуры
Procedure DrawYou3d(Const X,Y:Single);/\

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


  • Похожий контент

    • От Jeysi Z
      Здравствуйте. Для проекта понадобилось мышью перемещать TSphere по линии, нарисованной с помощью Drawline. Не подскажите, как можно реализовать такое движение строго вдоль линии. Хотя, был бы благодарен если бы помогли понять обычное движение 3d объектов. Заранее спасибо.
    • От Barbanel
      Всем привет!
      Столкнулись с новой задачей: при копировании файла во внутреннюю память все идет хорошо, при копировании на SD-карту получаем отказ в доступе, что сегодня вполне ожидаемо.
      Умные люди говорят (и даже дают ссылку), что начиная с апи примерно 22, для того чтобы писать на карту памяти нужно просить у пользователя разрешение.
      https://stackoverflow.com/questions/33139754/android-6-0-marshmallow-cannot-write-to-sd-card
      Есть пример на Java, но я понятия не имею как это сделать на Delphi. Насколько я понимаю, выполнть Java-код из Delphi невозможно, так?
      Есть ли какой обходной путь, или встроенная возможность как запросить права у пользователя?
      Всем заранее спасибо!
    • От Jeysi Z
      Здравствуйте, хотел поинтересоваться, как писать что-то в процедуре render на context?
    • От Jeysi Z
      Здравствуйте, для проекта понадобилось рисовать линии в 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;
      На изображении результат работы программы.

    • От fima
      Здравствуйте. Может кто из форумчан подскажет, как реализовать сабж. Нашла видео на ютубе, но там перемещение сферы по объекту Plane. А как реализовать перемещение по всей сцене? Допустим на сцене есть только один объект TCube, как его переместить мышкой в нужную позицию?
    • От denprox
      Доброго времени суток! Поиск по форуму не дал результатов, по этому решил спросить сам. Каким образом возможно реализовать возможность изменения размеров у некоторых объектов таким же образом, как и в дизайнере. Т.е. при выделении (клике) по объекту, активировать рамку объекта с кружочками, потянув за которые можно изменить размер ? 
    • От notricky
      Почему-то код, исправно работающий для WIN, не работает на ANDROID.
      procedure AssignEventToComponent(C: TComponent; MethodName: String; const Evt: TNotifyEvent; OnlyIfNil: boolean = true); var M: TMethod; begin M := GetMethodProp(C,MethodName); if not OnlyIfNil or (M.Code = nil) then begin TNotifyEvent(M) := Evt; SetMethodProp(C,MethodName,M); end; end; Есть какие-то особенности работы TMethod для ANDROID?
    • От Alesk
      Как подключить gesturemanager1 к кнопке созданной в runtime?
      Когда пишу эту строчку
      izm[ii].Touch.GestureManager:=GestureManager1; ругается на Gesturemanager1
      izm[ii] - массив из tbutton
    • От Alesk
      Фрагмент кода:
      nad[g]:= tlabel.Create(tabbedwithnavigationform.label1); nad[g].BeginUpdate; nad[g].Size.height:=24; nad[g].Size.Width:=350; nad[g].Text:=we; nad[g].position.y:=-99; nad[g].Align:=talignlayout.Top; nad[g].FontColor:=$FFFEFEFE; nad[g].EndUpdate; nad[g].Parent:= pod[g]; где nad[g] - массив из tlabel, а pod[g] - массив из tlistview
      Нужно чтобы при создании цвет текста становился белым, но почему-то не работает, цвет остается черным
    • От Rusland
      Как изменить родителя у компонента? Например, Image1 лежит на Layout1. Как его программно перенести на Layout2?
  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...