Jump to content
Korean Random
valanchik

Как выделить прямоугольный периметр танка?

Recommended Posts

Задача такая: нужно нарисовать 2D проекцию периметра габаритов танка.

Отсюда два вопроса:

   1. Как получить габаритные размеры модели танка(пусть даже 3D)?

   2. Как нарисовать прямоугольник произвольной формы?

Edited by valanchik

Share this post


Link to post

Short link
Share on other sites

неужели сложный или невыполнимый вопорс? Может чёт уточнить?

Share this post


Link to post

Short link
Share on other sites
15 часов назад, valanchik сказал:

Задача такая: нужно нарисовать 2D проекцию периметра габаритов танка.

Отсюда два вопроса:

   1. Как получить габаритные размеры модели танка(пусть даже 3D)?

   2. Как нарисовать прямоугольник произвольной формы?

 

1. vehicle.typeDescriptor.hull.hitTester.bbox - массив с координатами габаритов корпуса модели танка

2. Ни как, игра 3D, модели создавайте

 

Share this post


Link to post

Short link
Share on other sites
1 hour ago, StranikS_Scan said:

 

1. vehicle.typeDescriptor.hull.hitTester.bbox - массив с координатами габаритов корпуса модели танка

2. Ни как, игра 3D, модели создавайте

 

спасибо большое! хоть что-то...
Если интересно, то я хочу сделать автоматическую разметку данных для компьютерного зрения. Ручками с видео уже запарился. :)

1 hour ago, StranikS_Scan said:

 

1. vehicle.typeDescriptor.hull.hitTester.bbox - массив с координатами габаритов корпуса модели танка

2. Ни как, игра 3D, модели создавайте

 

v.typeDescriptor.hull.hitTester.bbox - выдаёт это:

((-0.953349, -0.520142, -3.27106), (0.953349, 0.482166, 2.86672), 3.446629762649536)

 

я так понял что первый массив -  это x1,y1,z1, второй x2,y2,z2

а третий элемент что за число?

Edited by valanchik

Share this post


Link to post

Short link
Share on other sites
08.05.2020 в 21:20, StranikS_Scan сказал:

 

2. Ни как, игра 3D, модели создавайте

 

 

ЕМНИП, есть DebugDrawer с набором примитивов.

  • Upvote 1

Share this post


Link to post

Short link
Share on other sites
4 часа назад, Mixaill сказал:

 

ЕМНИП, есть DebugDrawer с набором примитивов.

 

С ведроидом не перепутал, там как раз такая штука есть DebugDrawer?

Share this post


Link to post

Short link
Share on other sites
22 hours ago, StranikS_Scan said:

 

С ведроидом не перепутал, там как раз такая штука есть DebugDrawer?

import DebugManager
DebugManager.showRectangle2D(groupID, name, start, end, isPixels=False, color=COLORS.DEFAULT)

есть такой способ, но в моём случае, что-то нифига не выводит на экран. Пробовал и регистрировать группу и так и сяк, но что-то нифига не реагирует.

Может где-то надо переменную окружения какую-нить изменить, что у меня типа дебаг режим?
Пробую из ориона по F10 

и ещё по теме: 

v.typeDescriptor.hull.hitTester.bbox - недостаточно.

есть такой способ получения точек танка(включая точки bbox)

for vehiclePoint in getVisibilityCheckPointsGen(vehicle)
	....

на выходе 7мь точек.

Но мне, чтобы построить вокруг танка парралелепипед - надо ещё знать ширину танка. Кто знает как узнать ширину танка?

Edited by valanchik

Share this post


Link to post

Short link
Share on other sites
22 минуты назад, valanchik сказал:

есть такой способ, но в моём случае, что-то нифига не выводит на экран.

 

Ну потому что там пусто внутри - тыц:smile:

 

24 минуты назад, valanchik сказал:

на выходе 7мь точек.

Но мне, чтобы построить вокруг танка парралелепипед - надо ещё знать ширину танка. Кто знает как узнать ширину танка?

 

Да вы батенька шутник. Обзорные точки по вашему вычисляются без учета ширины танка )))

Share this post


Link to post

Short link
Share on other sites
46 minutes ago, StranikS_Scan said:

Да вы батенька шутник. Обзорные точки по вашему вычисляются без учета ширины танка )))

def getVehiclePointsGen(vehicle):
    vehicleDesr = vehicle.typeDescriptor
    hullPos = vehicleDesr.chassis.hullPosition
    hullBboxMin, hullBboxMax, _ = vehicleDesr.hull.hitTester.bbox
    turretPosOnHull = vehicleDesr.hull.turretPositions[0]
    turretLocalTopY = max(hullBboxMax.y, turretPosOnHull.y + vehicleDesr.turret.hitTester.bbox[1].y)
    yield Vector3(0.0, hullPos.y + turretLocalTopY, 0.0)
    gunPosOnHull = turretPosOnHull + vehicleDesr.turret.gunPosition
    yield hullPos + gunPosOnHull
    hullLocalCenterY = (hullBboxMin.y + hullBboxMax.y) / 2.0
    hullLocalPt1 = Vector3(0.0, hullLocalCenterY, hullBboxMax.z)
    yield hullPos + hullLocalPt1
    hullLocalPt2 = Vector3(0.0, hullLocalCenterY, hullBboxMin.z)
    yield hullPos + hullLocalPt2
    hullLocalCenterZ = (hullBboxMin.z + hullBboxMax.z) / 2.0
    hullLocalPt3 = Vector3(hullBboxMax.x, gunPosOnHull.y, hullLocalCenterZ)
    yield hullPos + hullLocalPt3
    hullLocalPt4 = Vector3(hullBboxMin.x, gunPosOnHull.y, hullLocalCenterZ)
    yield hullPos + hullLocalPt4

Я даже понимаю, что всё что мне надо по точкам(включая ширину танка), скорее всего можно вывести векторами на примере кода выше. Но это же трындец товарищи. И только потому что я чуть-чуть извращенец в программировании до сих пор пытаюсь добиться своей цели. Пальцем в небо тоже не очень программировать. Просто значение ширины меня бы удовлетворило бы. А тут пока для меня куча неизвестных. 

46 minutes ago, StranikS_Scan said:

 

Ну потому что там пусто внутри - тыц.:smile:

Согласен, но надеялся на чудо :)

 

И ещё.... Все точки корпуса(из семи) находятся в одной плоскости. Точки на башне(кроме верхей по центру) тоже не симметричны. В итоге из полезной инфы:

точка по центру башни

точка по центру дна корпуса

центр переда и зада корпуса.

И все эти 4ре точки в одной плоскости. Надо знать ширину танка или ещё какой-то способ узнать габариты корпуса.

вот даже наглядно сделал :)

Annotation 2020-05-12 203307.png

точки поднял на 1 унит вверх, чтобы видно было

 

и ещё наглядней 

 

Edited by valanchik

Share this post


Link to post

Short link
Share on other sites

Короче я тут подзатупил чуток :)

узнал я свою ширину :)

    cMin, cMax, _ = vehicle.getBounds(TankPartIndexes.CHASSIS)
    addModel(vehicle, Math.Vector3(vehicle.position.x+cMin.x, vehicle.position.y, vehicle.position.z))
    addModel(vehicle, Math.Vector3(vehicle.position.x+cMax.x, vehicle.position.y, vehicle.position.z))

просто чуток подзабыл как с векторами работать :) 

Edited by valanchik
  • Upvote 1

Share this post


Link to post

Short link
Share on other sites

Полный код получения 8ми точек для построения периметра танка без учета орудия:

from Math import Vector3, Matrix
from vehicle_systems.tankStructure import TankPartIndexes
def printPoints(vehicle):
    matrix = Matrix(vehicle.matrix)
    cMin, cMax, _ = vehicle.getBounds(TankPartIndexes.CHASSIS)
    _, hMax, _ = vehicle.getBounds(TankPartIndexes.HULL)
    hMax.y+=cMax.y;
    _, tMax, _ = vehicle.getBounds(TankPartIndexes.TURRET)
    tMax.y+=hMax.y;
    cMax.y = tMax.y
    BACK_LEFT_BOTTOM = matrix.applyVector(cMin)+vehicle.position
    BACK_LEFT_TOP = matrix.applyVector(Vector3(cMin.x, cMax.y, cMin.z))+vehicle.position
    BACK_RIGTH_BOTTOM = matrix.applyVector(Vector3(cMax.x, cMin.y, cMin.z))+vehicle.position
    BACK_RIGTH_TOP = matrix.applyVector(Vector3(cMax.x, cMax.y, cMin.z))+vehicle.position
    FRONT_RIGTH_TOP = matrix.applyVector(cMax)+vehicle.position
    FRONT_RIGTH_BOTTOM = matrix.applyVector(Vector3(cMax.x, cMin.y, cMax.z))+vehicle.position
    FRONT_LEFT_TOP = matrix.applyVector(Vector3(cMin.x, cMax.y, cMax.z))+vehicle.position
    FRONT_LEFT_BOTTOM = matrix.applyVector(Vector3(cMin.x, cMin.y, cMax.z))+vehicle.position
    width =  BACK_LEFT_TOP.distTo(BACK_RIGTH_TOP)
    height = BACK_LEFT_TOP.distTo(BACK_LEFT_BOTTOM)
    length = BACK_LEFT_TOP.distTo(FRONT_LEFT_TOP)    
    

это было больно и жестоко, но я это сделал :)

Сочувствую вам, мододелы....

Тема закрыта.

Edited by valanchik
  • Upvote 1

Share this post


Link to post

Short link
Share on other sites
On 5/17/2020 at 1:41 PM, valanchik said:

 

А как ты в итоге рисуешь прямоугольники? 
или это уже машинное зрение дорисовывает

Share this post


Link to post

Short link
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...