forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Xors3D (http://forum.boolean.name/forumdisplay.php?f=126)
-   -   Xors3D + BlitzMax (http://forum.boolean.name/showthread.php?t=14261)

Amatsu 20.02.2011 17:56

Ответ: Xors3D + BlitzMax
 
Кстати, заметил особенность - xLinePick юзает не отрезок, а луч, хотя в параметрах и предлагается указать координаты двух концов.

Knightmare 20.02.2011 17:58

Ответ: Xors3D + BlitzMax
 
Вообще-то отрезок и юзается. Точнее из него делается луч, а последний параметр задает его длину, если поставить 0 - высчитается автоматом.

Amatsu 20.02.2011 18:04

Ответ: Xors3D + BlitzMax
 
Цитата:

Сообщение от Knightmare (Сообщение 179758)
Вообще-то отрезок и юзается. Точнее из него делается луч, а последний параметр задает его длину, если поставить 0 - высчитается автоматом.

Тю мля :crazy: Я думал последний параметр - радиус линии в поперечнике, как у аналогичной команды в блитце. Теперь ясно, пойду править косяки

Knightmare 20.02.2011 18:05

Ответ: Xors3D + BlitzMax
 
В блитзе это тоже длина. Но в диапазоне [0; 1].

Amatsu 20.02.2011 18:08

Ответ: Xors3D + BlitzMax
 
Да? 0_о Хм... А вроде работало как радиус :crazy: Вот что значит на блитцмакс с ксорсом перешел :-D

Amatsu 24.02.2011 22:23

Ответ: Xors3D + BlitzMax
 
Что-то у меня закрадываются смутные сомнения, что xEntityPick страшно не дружит с тримешами...

Knightmare 24.02.2011 22:32

Ответ: Xors3D + BlitzMax
 
Чем он у тебя не дружит?

Amatsu 24.02.2011 22:37

Ответ: Xors3D + BlitzMax
 
Чуть позже наверное пример выложу. Если не решу проблему. Извиняюсь за беспокойство

Amatsu 24.02.2011 23:22

Ответ: Xors3D + BlitzMax
 
Код:

' Импорт модуля
Import xorsteam.xors3d

SuperStrict




' Загрузка конфигурации
Global GWidth:Int = 640
Global GHeight:Int = 480
Global GDepth:Int = 32
Global GMode:Int = 1
Global ShadowMode:Int = 0
Global EffectMode:Int = 0
Global GlowMode:Int = 0
Global ContrastMode:Int = 0
Global VSyncMode:Int = 0

Local fileout:TStream = ReadFile("game.cfg")
If fileout Then
  GWidth = ReadInt(fileout)
  GHeight = ReadInt(fileout)
  GDepth = ReadInt(fileout)
  ShadowMode = ReadInt(fileout)
  EffectMode = ReadInt(fileout)
  GlowMode = ReadInt(fileout)
  ContrastMode = ReadInt(fileout)
  VSyncMode = ReadInt(fileout)
EndIf





' Инициализация 3D-режима
xAppTitle "Exilium"
xGraphics3D GWidth, GHeight, GDepth, 1, VSyncMode
SeedRnd MilliSecs()
xHidePointer()

' Антиалайзинг
xSetAntiAliasType(8)
xAntiAlias False

' Фильтрация
xSetTextureFiltering(TF_ANISOTROPICX8)

' Загрузка шрифта
Global arial:Int = xLoadFont("Arial", 12)

' Переменная отладки
Global debug_info:Byte




' Создание камеры
Global camera:Int = xCreateCamera()
xCameraRange camera, 0.1, 3000
xCameraEnableShadows(camera)

' Создание света и тени
xInitShadows(1024, 1024, 1024)
xSetShadowParams 5, 0.95, True, 300
xSetShadowsBlur(5)

Global light_up:Int = xCreateLight()
xRotateEntity light_up, 70, 45, 0
xLightEnableShadows light_up, 1
xLightShadowEpsilons light_up, 0.0001, 0.016









' Загрузка уровня
Global world_scale:Float = 0.35

'Global level:Int = xLoadMesh("data\maps\battle\1\level3.b3d")
'Local level_tex:Int = xLoadTexture("data\maps\battle\1\1.jpg")
'xEntityTexture level, level_tex
''xScaleMesh level, 1.3 * world_scale, 1.3 * world_scale, 1.3 * world_scale
''xPositionEntity level, 0, 640 * world_scale, 50 * world_scale
'xScaleMesh level, 13 * world_scale, 13 * world_scale, 13 * world_scale
'xPositionEntity level, 0, -250, 10
'xUpdateNormals level
'
'xEntityAddHullShape level, 0
'xEntityAlpha level, 0.3
'xEntityPickMode level, 2

Local c1:Int = xCreateCube()
xScaleMesh c1, 300, 5, 300
xPositionEntity c1, 0, -25, 0
'xEntityAddBoxShape c1, 0
'xEntityPickMode c1, 3
xEntityAddHullShape c1, 0
xEntityPickMode c1, 2

'testtt = xLoadAnimMesh("D:\Developing\realise_models2\HERO_EX1\test.b3d")
''testtt=xLoadAnimMesh("D:\Developing\realise_models2\HERO1\test6.b3d")
'xUpdateNormals testtt
'xAnimate(testtt,ANIMATION_LOOP,1.5)
'xScaleEntity testtt, 2, 2, 2
''xScaleEntity testtt, 15, 15, 15
'xEntityFX testtt,FX_FULLBRIGHT



' Загрузка персонажа
TBattleCharacter.CreateBattleCharacter("player", 1, 1, 999)
Global cube:Int = xCreateCube()


' Инициация mouse look
Global mxs:Float, mys:Float, dest_xang:Float, dest_yang:Float, xang:Float, yang:Float
Global camera_target:Int = xCreatePivot()
Global dist_target:Int = xCreatePivot(camera_target)

Global move_target:Int = xCreateCube()






' Главный цикл
While Not xKeyDown(1)

  If VSyncMode Then Delay(16)

  If xMouseHit(1) Then ShootSphere(camera)

  If xKeyHit(88) Then debug_info = Not debug_info

  ' Обработка персонажей
  UpdateCharacters()

  ' Обработка мира
  xUpdateWorld

  xRenderWorld(1.0, 1)

  ' Вывод отладочной информации
  xPhysicsDebugRender debug_info
  If debug_info Then
    xText 10, 10, "FPS: " + xGetFPS()
  EndIf

  ' drawing the scene
  xFlip
Wend






'==============================================================
'
' Пользовательские типы
'
'==============================================================

' Тип персонажа
Type TBattleCharacter
  Global list:TList = CreateList()
  Global list_count:Int

  Field model:Int, anim_mesh:Int
  Field selected:Byte
  Field name:String
  Field level:Int, life:Int, life_max:Int

 
  ' Создание персонажа
  Function CreateBattleCharacter:TBattleCharacter(variant:String, selected:Byte, level:Int, life:Int)
    Select variant
            Case "player"
        Local bchar:TBattleCharacter = New TBattleCharacter

        ' Определение переменных
        bchar.selected = selected
        bchar.level = level
        If bchar.level > 99
          bchar.level = 99
        ElseIf bchar.level < 1
          bchar.level = 1
        EndIf

        ' Определение постоянных
        bchar.name = variant

        ' Определение параметров
        bchar.life_max = 60 + bchar.level * 27
        bchar.life = life
        If bchar.life > bchar.life_max
          bchar.life = bchar.life_max
        ElseIf bchar.life < 1
          bchar.life = 1
        EndIf

        ' Загрузка моделей
        bchar.model = xCreateCube()
        xScaleMesh bchar.model, 14 * world_scale, 40 * world_scale, 14 * world_scale
'        xEntityAddBoxShape bchar.model, 10

        TBattleCharacter.list.AddLast(bchar)
        TBattleCharacter.list_count:+1
    End Select
  End Function

  ' Обработка персонажа
  Method Update()
    If selected = 1 Then
      MouseLook(model)
      If xMouseHit(2) Then
        xCameraPick(camera, xMouseX(), xMouseY())
        xPositionEntity move_target, xPickedX(), xPickedY(), xPickedZ()
      EndIf
'      If xEntityDistance(move_target, model) > 10 Then
'        xTranslateEntity model, (xEntityX(move_target, 1) - xEntityX(model, 1)) / 10, (xEntityY(move_target, 1) - xEntityY(model, 1)) / 10, (xEntityZ(move_target, 1) - xEntityZ(model, 1)) / 10
'      EndIf
    EndIf
  End Method

End Type
End






'==============================================================
'
' Пользовательские функции
'
'==============================================================

' Обработка всех персонажей
Function UpdateCharacters()
  For Local bchar:TBattleCharacter = EachIn TBattleCharacter.list
    bchar.Update()
  Next
End Function




' Mouse look
Function MouseLook(target:Int, height:Float = 10, distance:Float = 100, rotate:Float = 50)
  Local collision_distance:Float = 5

  If target <> 0 Then
    If xKeyDown(17) Then xTranslateEntity target, 0, 0, 1
    If xKeyDown(31) Then xTranslateEntity target, 0, 0, -1
    If xKeyDown(30) Then xTranslateEntity target, -1, 0, 0
    If xKeyDown(32) Then xTranslateEntity target, 1, 0, 0

    mxs = xMouseX() - xGraphicsWidth() / 2
    mys = xMouseY() - xGraphicsHeight() / 2
    xMoveMouse xGraphicsWidth() / 2, xGraphicsHeight() / 2
    mxs = mxs / (rotate / 12)
    mys = mys / (rotate / 12)
    If mxs>rotate Then mxs=rotate
    If mxs < - rotate Then mxs = -rotate
    If mys > rotate Then mys = rotate
    If mys < - rotate Then mys = -rotate

    dest_yang = dest_yang + mys
    If dest_yang < - 85 Then dest_yang = -85
    If dest_yang > 85 Then dest_yang = 85
    yang = (yang + ((dest_yang - yang) - (dest_yang - yang) / 1.5) / 1.5)

    dest_xang = dest_xang - mxs
    If dest_xang > 179.9999 Then
      dest_xang = dest_xang - 359.9999
      xang = xang - 359.9999
    EndIf
    If dest_xang < - 179.9999 Then
      dest_xang = 359.9999 + dest_xang
      xang = 359.9999 + xang
    EndIf
    xang = (xang + ((dest_xang - xang) - (dest_xang - xang) / 1.5) / 1.5)


    xPositionEntity camera_target, xEntityX(target, 1), xEntityY(target, 1), xEntityZ(target, 1)
    xRotateEntity camera_target, 0, xang, 0
    xPositionEntity dist_target, 0, Sin(yang) * distance, -Cos(yang) * distance

    Local vis_line_x:Float = xEntityX(camera_target, 1)
    Local vis_line_y:Float = xEntityY(camera_target, 1)
    Local vis_line_z:Float = xEntityZ(camera_target, 1)
    Local vis_line_dx:Float = xEntityX(dist_target, 1)
    Local vis_line_dy:Float = xEntityY(dist_target, 1)
    Local vis_line_dz:Float = xEntityZ(dist_target, 1)

    If xLinePick(vis_line_x, vis_line_y, vis_line_z, vis_line_dx, vis_line_dy, vis_line_dz, distance) <> 0 Then
'      xPositionEntity camera, xPickedX() - (xPickedX() - vis_line_x) / collision_distance, xPickedY() - (xPickedY() - vis_line_y) / collision_distance, xPickedZ() - (xPickedZ() - vis_line_z) / collision_distance
      xPositionEntity camera, xPickedX(), xPickedY(), xPickedZ()
    Else
'      xPositionEntity camera, vis_line_x + (vis_line_dx - vis_line_x) / (collision_distance * (0.25 + yang / 1000)), vis_line_y + (vis_line_dy - vis_line_y) / (collision_distance * (0.25 + yang / 1000)), vis_line_z + (vis_line_dz - vis_line_z) / (collision_distance * (0.25 + yang / 1000))
'      xPositionEntity camera, vis_line_x + (vis_line_dx - vis_line_x) / (collision_distance * 0.24), vis_line_y + (vis_line_dy - vis_line_y) / (collision_distance * 0.24), vis_line_z + (vis_line_dz - vis_line_z) / (collision_distance * 0.24)
      xPositionEntity camera, vis_line_dx, vis_line_dy, vis_line_dz
    EndIf
    xPointEntity camera, camera_target
  EndIf
End Function




' function to shoot sphere
Function ShootSphere(camera%)
        Local sphere:Int = xCreateSphere()
        xPositionEntity(sphere, xEntityX(camera, True), xEntityY(camera, True) - 5, xEntityZ(camera, True))
        xEntityColor(sphere, 255, 0, 0)
        xEntityAddSphereShape(sphere, 1.0, 1.0)
        xTFormNormal 0.0, 0.0, 1.0, camera, 0
        xEntityApplyCentralImpulse(sphere, xTFormedX() * 50, xTFormedY() * 50, xTFormedZ() * 50)
End Function

Вот пример. Я уже не из б3д меш гружу а просто создаю куб, юзаю на нем тримеш в том числе и для пика. В центре карты камера нормально упирается в "землю" не проваливаясь. При приближении к краям пик перестает работать, камера "проваливается" в куб
И да, такой же абсолютно код маус лока (за исключением измененной команды лайнпика в ксорсе) прекрасно работал в блитце, в той же моей демке avallon

Knightmare 24.02.2011 23:26

Ответ: Xors3D + BlitzMax
 
Какую-то адовую фигню творишь. Потом прогоню код.

Amatsu 24.02.2011 23:27

Ответ: Xors3D + BlitzMax
 
Цитата:

Сообщение от Knightmare (Сообщение 180472)
Какую-то адовую фигню творишь. Потом прогоню код.

Я пока к бмаксу привыкаю, потому куча закомменченного

Knightmare 24.02.2011 23:34

Ответ: Xors3D + BlitzMax
 
Я чего-то нифига не понял в твоем примере. Что хоть должно быть? И что не так?

Amatsu 24.02.2011 23:37

Ответ: Xors3D + BlitzMax
 
WASD - передвижение. Камера вращается вокруг параллелепипеда, если повернуть ее вниз - она "упирается" в "пол". Но если двигать параллелепипед к краю - камера начнет проваливаться в "пол", будто коллижен-боди у "пола", по которому рассчитывается лайнпик, закончилось раньше, чем мы подошли к краю меша.
И это он на боксе так начинает проваливаться. Если загрузить простенький уровень - при подходе к удаленным от центра координат стенам начинается пляска камеры, будто лайнпик превращается из луча в прямую и пикает в обе стороны.
Если убрать пик - камера нормально вращается на любом отдалении параллелепипеда от центра координат. Так что если косяк у меня - то не во вращении камеры... наверное...
Да, еще, если отдалятся от центра, упершись камерой в "пол" - точка пика будто смещается, хотя если оторвать камеры от пола - камера нормально центрирована на параллелепипеде

Knightmare 25.02.2011 16:00

Ответ: Xors3D + BlitzMax
 
Решение твоей проблемы:
Код:

If xLinePick(vis_line_x, vis_line_y, vis_line_z, vis_line_dx - vis_line_x, vis_line_dy - vis_line_y, vis_line_dz - vis_line_z, distance) <> 0 Then

Amatsu 25.02.2011 16:13

Ответ: Xors3D + BlitzMax
 
:''(( У меня изначально код был:
Код:

    Local vis_line_x:Float = xEntityX(camera_target, 1)
    Local vis_line_y:Float = xEntityY(camera_target, 1)
    Local vis_line_z:Float = xEntityZ(camera_target, 1)
    Local vis_line_dx:Float = xEntityX(dist_target, 1)-vis_line_x
    Local vis_line_dy:Float = xEntityY(dist_target, 1)-vis_line_y
    Local vis_line_dz:Float = xEntityZ(dist_target, 1)-vis_line_z

Но прочитал в хелпе что dx- х координата, потому подумал что надо в глобальных координатах указывать, в отличие от блитца... И убрал...
В общем очень извиняюсь за тупость, огромное спасибо за выявление моего косяка


Часовой пояс GMT +4, время: 10:18.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot