Перейти к содержанию
Fire Monkey от А до Я
  • 0

Не работает OnClick по TModel3D


Tarik02

Вопрос

Смотрел вот http://fire-monkey.ru/topic/619-pochemu-u-menia-ne-rabotaet-onclick-po-3d-obektu/, но там ничего не понял, у меня есть форма TForm3D, и на ней TDummy, а на этом TDummy находится TModel3D. Вот при клике на эту модель, нужно чтобы работало событие OnClick. Но оно не работает!

Ссылка на комментарий

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

  • 0

Попробовал тут то что написано в той теме, не помогло. Похоже это баг или фича (у меня и в XE6 Update 1 и в XE7 такое, а как в XE7 Update 1 - не знаю). TSphere протыкивается, TDummy и TModel3D не протыкивается даже при HitTest=true. В случае тычка по Dummy или Model3D под которыми только форма, протыкивается собственно сама форма, т.е. событие OnMouseDown TForm, элегантного решения не вижу, могу предложить брать координаты тычка, и сравнивать их с областью занятой Model3D, ну и в случае попадания в его область - обрабатывать.

Ссылка на комментарий
  • 0

Если у тебя у Dummy и Model3D  Projection= Screen (иначе надо переводить как-то координаты из Camera), то при RotationAngles равных 0 (иначе как-то ещё угол надо будет учитывать) в Dummy и Model3D можно сделать так:

procedure TForm6.Form3DMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Single);
var CenterModel3D_x, CenterModel3D_y, Model3D_x0, Model3D_y0, Model3D_x1, Model3D_y1: single;
begin
//showmessage('Click '+floattostr(X)+' '+floattostr(Y));
//showmessage('Dummy '+floattostr(Dummy1.Position.X)+' '+floattostr(Dummy1.Position.Y));
//showmessage('Model3D '+floattostr(Model3D1.Position.X)+' '+floattostr(Model3D1.Position.Y));      // внутри Dummy получается, т.е. локальные координаты

CenterModel3D_x:=Dummy1.Position.X+Model3D1.Position.X;
CenterModel3D_y:=Dummy1.Position.Y+Model3D1.Position.Y;


Model3D_x0:=CenterModel3D_x-Model3D1.Width/2;   // левый верхний угл
Model3D_y0:=CenterModel3D_y-Model3D1.Height/2;  // левый верхний угл
Model3D_x1:=CenterModel3D_x+Model3D1.Width/2;   // правый нижний
Model3D_y1:=CenterModel3D_y+Model3D1.Height/2;  // правый нижний

if ((X>=Model3D_x0) and (X<=Model3D_x1)) and ((Y>=Model3D_y0) and (Y<=Model3D_y1)) then
begin
  showmessage('Click on Model3D');
end;



end;

В общем я проверил этот код, как костыль может сойдёт, может я что-то не так там конечно рассчитал, но вроде нормально. Если тыкаю рядом с Model3D1 тычёк не засчитывается, тыкаю по Model3D1 - два варианта, ближе к центру = засчитал, дальше = не засчитал. Вероятно это грубо слишком, и хоть модель у меня там более менее квадратная была, либо Width и Height у него не такие явные. Короче потести, в зависимости от задачи может прокатить (например для планшета когда пальцем тыкаешь довольно таки неплохо может выйти). Но вообще это конечно извращение какое-то))

 

не знаю может ещё как-то координаты через MeshCollection (Model3D1.MeshCollection) находятся, чтобы прям меша были.

Ссылка на комментарий

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

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

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

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

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

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

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

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

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