|
10.06.2011, 13:53
|
#1
|
Знающий
Регистрация: 08.11.2010
Адрес: Москва
Сообщений: 285
Написано 78 полезных сообщений (для 182 пользователей)
|
Проблема пика линий
Здравствуйте. Возникла следующая проблема: требуется пикнуть линию нарисованную с помощью FatImage. Cкрин:
Кусок кода:
Function DrawMove(Entity%, size# = 5)
x = EntityX(Entity%)
y = EntityY(Entity%)
z = EntityZ(Entity%)
dist# = EntityDistance(Entity%, EditorCam)/size#
SetColor 0, 255, 0
Line3d(editorcam% , x, y, z, 0, dist#, z)
SetColor 0, 0, 0
DrawText("Y", ProjectedX#(), ProjectedY#())
SetColor 255, 0, 0
Line3d(editorcam% , x, y, z, dist#, y, z)
SetColor 0, 0, 0
DrawText("X", ProjectedX#(), ProjectedY#())
SetColor 0, 0, 255
Line3d(editorcam% , x, y, z, x, y, dist#)
SetColor 0, 0, 0
DrawText("Z", ProjectedX#(), ProjectedY#())
End Function
Function Line3d(cam% , x#, y#, z#, xw#, yw#, zw#)
CameraProject cam,x#,y#,z#
Gx = ProjectedX#()
Gy = ProjectedY#()
CameraProject cam,xw#,yw#,zw#
Gxw = ProjectedX#()
Gwy = ProjectedY#()
DrawLine Gx, Gy, Gxw, Gwy
End Function
|
В общем прошу помочь. К сожалению самостоятельно соображать не могу, мешает один ворвавшийся в дом человек.
Заранее благодарю.
|
(Offline)
|
|
10.06.2011, 14:53
|
#2
|
|
Ответ: Проблема пика линий
Рисуй линии цилиндрами и пикай их CameraPick
|
|
|
Сообщение было полезно следующим пользователям:
|
|
10.06.2011, 15:01
|
#3
|
Знающий
Регистрация: 08.11.2010
Адрес: Москва
Сообщений: 285
Написано 78 полезных сообщений (для 182 пользователей)
|
Ответ: Проблема пика линий
Рисуй линии цилиндрами и пикай их CameraPick
|
Если так, то лучше параллелепипедами.
Не катит, на то свои причины.
|
(Offline)
|
|
10.06.2011, 15:25
|
#4
|
Разработчик
Регистрация: 06.06.2011
Адрес: Ирк. обл.
Сообщений: 541
Написано 133 полезных сообщений (для 220 пользователей)
|
Ответ: Проблема пика линий
В Xors3D есть samples Редактора ))) Посмотри там как сделано да и все...
Include "xors3d.bb" xSetAntiAliasType xGetMaxAntiAlias() xAppTitle "Editor sample" xGraphics3D 800, 600, 32, False, True xAntiAlias True camera = xCreateCamera() xCameraClsColor camera, 192, 192, 192 xPositionEntity camera, 10, 10, 10 light = xCreateLight() cube = xCreateCube() xPointEntity camera, cube logoTexture = xLoadTexture("..\..\media\textures\logo.jpg") xEntityTexture cube, logoTexture controlType = 0 ;/ 0 - move, 1 - rotate, 2 - scale selectMask = 0 deltaX# = 1.0 deltaY# = 1.0 deltaZ# = 1.0 scaleXInit# = 1.0 scaleYInit# = 1.0 scaleZInit# = 1.0 Global controllPosX# = 0.0 Global controllPosY# = 0.0 Global controllPosZ# = 0.0 Global mouseSpeedX = 0 Global mouseSpeedY = 0 Global used_controller$ = "" ; main program loop While Not xKeyDown(KEY_ESCAPE) xColor 100, 0, 0 mouseSpeedX = xMouseXSpeed() mouseSpeedY = xMouseYSpeed() ; camera control If xKeyDown(KEY_W) Then xMoveEntity camera, 0, 0, 1 If xKeyDown(KEY_S) Then xMoveEntity camera, 0, 0, -1 If xKeyDown(KEY_A) Then xMoveEntity camera, -1, 0, 0 If xKeyDown(KEY_D) Then xMoveEntity camera, 1, 0, 0 If xKeyHit(KEY_1) Then controlType = 0 If xKeyHit(KEY_2) Then controlType = 1 If xKeyHit(KEY_3) Then controlType = 2 ; render scene xRenderWorld() ; draw grid xDrawGrid(0, 0, 5, 100); ; draw gizmos x# = xEntityX(cube) y# = xEntityY(cube) z# = xEntityZ(cube) Select controlType Case 0 mask = xCheckMovementGizmo(x#, y#, z#, camera, xMouseX(), xMouseY()) If Not xMouseDown(1) selectMask = mask controllPosX = x controllPosY = y controllPosZ = z EndIf xDrawMovementGizmo(x#, y#, z#, selectMask) used_controller$ = "Used move controler" Case 1 mask = xCheckRotationGizmo(x#, y#, z#, camera, xMouseX(), xMouseY()) If Not xMouseDown(1) selectMask = mask controllPosX = x controllPosY = y controllPosZ = z deltaX# = 0.0 deltaY# = 0.0 deltaZ# = 0.0 EndIf xDrawRotationGizmo(x#, y#, z#, selectMask, deltaX, deltaY, deltaZ) used_controller$ = "Used rotate controler" Case 2 mask = xCheckScaleGizmo(x#, y#, z#, camera, xMouseX(), xMouseY()) If Not xMouseDown(1) selectMask = mask controllPosX = x controllPosY = y controllPosZ = z deltaX = 1.0 deltaY = 1.0 deltaZ = 1.0 scaleXInit = xEntityScaleX(cube) scaleYInit = xEntityScaleY(cube) scaleZInit = xEntityScaleZ(cube) EndIf xDrawScaleGizmo(x#, y#, z#, selectMask, deltaX, deltaY, deltaZ) used_controller$ = "Used scale controler" Default used_controller$ = "" End Select ; object control If xMouseDown(1) And selectMask <> 0 useX = (selectMask Shr 0) And 1 useY = (selectMask Shr 1) And 1 useZ = (selectMask Shr 2) And 1 useG = (selectMask Shr 3) And 1 factorX# = 0.7 / Float(xGraphicsWidth()) factorY# = 0.7 / Float(xGraphicsHeight()) Select controlType ; if movement gizmo is used Case 0 ; move controlled entity dx# = controllPosX - xEntityX(camera, True) dy# = controllPosY - xEntityY(camera, True) dz# = controllPosZ - xEntityZ(camera, True) dist# = Sqr(dx * dx + dy * dy + dz * dz) ; x-axis If useX move# = ComputeMove(camera, 10.0, 0.0, 0.0) * factorX * dist xTranslateEntity cube, move, 0.0, 0.0, False EndIf ; y-axis If useY move# = ComputeMove(camera, 0.0, 10.0, 0.0) * factorY * dist xTranslateEntity cube, 0.0, move, 0.0, False EndIf ; z-axis If useZ move# = ComputeMove(camera, 0.0, 0.0, 10.0) * factorX * dist xTranslateEntity cube, 0.0, 0.0, move, False EndIf ; if scaling gizmo is used Case 2 ; scale controlled entity dx# = controllPosX - xEntityX(camera, True) dy# = controllPosY - xEntityY(camera, True) dz# = controllPosZ - xEntityZ(camera, True) dist# = Sqr(dx * dx + dy * dy + dz * dz) ; x-axis If useX move# = ComputeMove(camera, 10.0, 0.0, 0.0) * factorX * dist deltaX = deltaX + move scaleXInit = scaleXInit + move xScaleEntity cube, scaleXInit, scaleYInit, scaleZInit EndIf ; y-axis If useY move# = ComputeMove(camera, 0.0, 10.0, 0.0) * factorY * dist deltaY = deltaY + move scaleYInit = scaleYInit + move xScaleEntity cube, scaleXInit, scaleYInit, scaleZInit EndIf ; z-axis If useZ move# = ComputeMove(camera, 0.0, 0.0, 10.0) * factorX * dist deltaZ = deltaZ + move scaleZInit = scaleZInit + move xScaleEntity cube, scaleXInit, scaleYInit, scaleZInit EndIf ; if rotation gizmo is used Case 1 ; rotate controlled entity ; x-axis If useX move# = ComputeMove(camera, 0.0, -10.0, 0.0) deltaX = deltaX + move xTurnEntity cube, move, 0.0, 0.0, True EndIf ; y-axis If useY move# = ComputeMove(camera, -10.0, -10.0, 0.0); deltaY = deltaY + move xTurnEntity cube, 0.0, move, 0.0, True EndIf ; z-axis If useZ move# = ComputeMove(camera, -10.0, 0.0, 0.0); deltaZ = deltaZ + move xTurnEntity cube, 0.0, 0.0, move, True EndIf End Select EndIf ; draw info xText 10, 10, "Use WSAD to move camera around scene" xText 10, 30, "Use 1, 2, 3 to change object controler" xText 10, 50, used_controller$ ; switch back buffer xFlip() Wend Function ComputeMove#(camera%, x#, y#, z#) If mouseSpeedX = 0 And mouseSpeedY = 0 Then Return 0.0 ; project axis on the screen xCameraProject(camera, controllPosX, controllPosY, controllPosZ) x1 = xProjectedX() y1 = xProjectedY() xCameraProject(camera, controllPosX + x, controllPosY + y, controllPosZ + z) x2 = xProjectedX() y2 = xProjectedY() ; compute angle between our vectors dx1 = x2 - x1 dy1 = y2 - y1 dx2 = mouseSpeedX dy2 = mouseSpeedY len1# = Sqr(dx1 * dx1 + dy1 * dy1) len2# = Sqr(dx2 * dx2 + dy2 * dy2) angle# = ACos(Float(dx1 * dx2 + dy1 * dy2) / (len1 * len2)) ; compute distance radii# = Sqr(dx2 * dx2 + dy2 * dy2) ; compute a new vector's x-component Return radii * Cos(angle) End Function
|
(Offline)
|
|
10.06.2011, 16:10
|
#5
|
Элита
Регистрация: 16.01.2010
Адрес: Новосибирск
Сообщений: 2,157
Написано 502 полезных сообщений (для 1,012 пользователей)
|
Ответ: Проблема пика линий
учебник геометрии,смотри про вектора.....
|
(Offline)
|
|
10.06.2011, 16:19
|
#6
|
Знающий
Регистрация: 08.11.2010
Адрес: Москва
Сообщений: 285
Написано 78 полезных сообщений (для 182 пользователей)
|
Ответ: Проблема пика линий
учебник геометрии,смотри про вектора.....
|
Я на даче, учебников нет. Модем только булку грузит, Труъ!
|
(Offline)
|
|
10.06.2011, 16:21
|
#7
|
|
Ответ: Проблема пика линий
Сообщение от Leowey
Если так, то лучше параллелепипедами.
|
3-гранный цилиндр - 8 треугольников
куб - 12 треугольников
Сообщение от Leowey
Не катит, на то свои причины.
|
Какие причины?
ЗЫ
Еще один + к цилиндрам - по ним куда проще попасть чем по тонким линиям
|
|
|
10.06.2011, 16:21
|
#8
|
Элита
Регистрация: 16.01.2010
Адрес: Новосибирск
Сообщений: 2,157
Написано 502 полезных сообщений (для 1,012 пользователей)
|
Ответ: Проблема пика линий
Я на даче, учебников нет. Модем только булку грузит, Труъ!
|
я всегда "на даче"
|
(Offline)
|
|
10.06.2011, 16:34
|
#9
|
Знающий
Регистрация: 08.11.2010
Адрес: Москва
Сообщений: 285
Написано 78 полезных сообщений (для 182 пользователей)
|
Ответ: Проблема пика линий
1) Высокая цена ентити
2) CameraPick медленно очень
3) Я что зря фастлибы покупал?
4) У меня в программе масштаб стрелок относительно камеры, с геометрией такое прокатит, но будет галюнить
Усё
|
(Offline)
|
|
10.06.2011, 16:57
|
#10
|
|
Ответ: Проблема пика линий
Сообщение от Leowey
1) Высокая цена ентити
2) CameraPick медленно очень
3) Я что зря фастлибы покупал?
4) У меня в программе масштаб стрелок относительно камеры, с геометрией такое прокатит, но будет галюнить
Усё
|
1) Один меш и сурфейс на все стрелки
2) Правда что-ли?
3) А причем тут эти библиотеки?
4) ну тут да, прийдется повозиться
Ну попробуй вычислять расстояние от указателя мыши до линий стрелок, вот функция
целые числа, дистанция в квадрате
Function PointLineDistanceSquared(x%, y%, x1%, y1%, x2%, y2%)
Local dx% = x2 - x1
Local dy% = y2 - y1
Local t% = (((x - x1) * dx + (y - y1) * dy) Shl 8) / (dx * dx + dy * dy)
If t < 0 Then
dx = x1 - x
dy = y1 - y
Else If t > (1 Shl 8) Then
dx = x2 - x
dy = y2 - y
Else
dx = x1 + ((dx * t) Sar 8) - x
dy = y1 + ((dy * t) Sar 8) - y
End If
Return dx * dx + dy * dy
End Function
x, y - точка
x1, y1, x2, y2 - отрезок
|
|
|
Эти 2 пользователя(ей) сказали Спасибо за это полезное сообщение:
|
|
10.06.2011, 17:17
|
#11
|
Элита
Регистрация: 16.01.2010
Адрес: Новосибирск
Сообщений: 2,157
Написано 502 полезных сообщений (для 1,012 пользователей)
|
Ответ: Проблема пика линий
вот тебе и геометрия...
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
10.06.2011, 17:51
|
#12
|
Знающий
Регистрация: 08.11.2010
Адрес: Москва
Сообщений: 285
Написано 78 полезных сообщений (для 182 пользователей)
|
Ответ: Проблема пика линий
Всем спасибо, я уже придумал как реализовать.
__________________________________________
1) Один меш и сурфейс на все стрелки
2) Правда что-ли?
3) А причем тут эти библиотеки?
4) ну тут да, прийдется повозиться
|
1) Тут соглашусь
2)Ещё Автэ писал
3)Я их купил и юзаю
4) Да
_____________________________________
|
(Offline)
|
|
10.06.2011, 20:47
|
#13
|
Знающий
Регистрация: 08.11.2010
Адрес: Москва
Сообщений: 285
Написано 78 полезных сообщений (для 182 пользователей)
|
Ответ: Проблема пика линий
Еще один + к цилиндрам - по ним куда проще попасть чем по тонким линиям
|
Ы, я задал линиям "виртуальную толщину". вроде работает.
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 07:53.
|