forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Blitz3D (http://forum.boolean.name/forumdisplay.php?f=45)
-   -   кубик рубика (http://forum.boolean.name/showthread.php?t=13791)

WhiteBlack 27.11.2010 23:29

кубик рубика
 
Вложений: 1
если у кого-то есть свободное время и нечем заняться, посмотрите что здесь не так, я с этим сижу уже весь день, скоро стану вот таким - :crazy:
когда включите нажмите стрелку вправо; не обращайте внимания на большучесть кода в некоторых местах, это я оптимизирую, мне главное понять почему при повторном нажатии на стрелку вправа происходит.... то что происходит (я пробовал и translate и moveentity все равно двигает в одну и ту же сторону, ну вобщем гляньте кому не лень

DeeJex 27.11.2010 23:48

Ответ: кубик рубика
 

Давненько не видел такой быдлокод...

Цитата:

посмотрите что здесь не так
Вот что: для поворота кубов юзай пивоты и парентинг(читай про это в хелпе)

pepel 27.11.2010 23:50

Ответ: кубик рубика
 
чет способ ваще помоему ущербный

мне видится такая схема: вращать отдельные части левой кнопкой мыши, правой кнопкой вращать весь кубик
естессно вращать можно по 90 градусов

чтобы прокрутить одну грань из 9ти кубиков присваивать им entityparent к пивоту , который находится в центре, а потом отцеплять его .
и при этом использовать трехмерный массив для хранения кубиков

WhiteBlack 30.11.2010 13:55

Ответ: кубик рубика
 
сделал через пивоты, да полегче(намного), просто я планировал двигать каждый кубик, мне казалося так интереснее
осталася одна проблема
PHP код:

......
Global 
pivtop=CreatePivot()
.....
repeat
.....
 If 
KeyHit(205Then
      oldyaw
(1)=EntityYaw(pivtop)
      
flag=1
      
For i=1 To 9
       EntityParent
(cubes(i), pivtop)
      
Next
    End 
If
    
    
TurnPiv() 
.....
until keyhit(1)

Function 
TurnPiv()
    If 
flag=1 Then
       
If EntityYaw(pivright)<oldyaw(1)+90 Then
          TurnEntity pivright
00.50
       
Else
          
flag=0
       End 
If  
    
End If
End Function 

при первом повороте все хорошо, верхняя сторона останавливается, но при втором нажатии она начинает вращаться бесконечно. Почему так?
я же вроде при каждом нажатии сохраняю текущий угол поворота:dontknow:

ABTOMAT 03.12.2010 23:10

Ответ: кубик рубика
 
Открой дебаггер и посмотри какие значения принимают переменные. Это поможет тебе понять, в чём дело.

WhiteBlack 04.12.2010 11:23

Ответ: кубик рубика
 
Цитата:

Сообщение от ABTOMAT (Сообщение 170794)
Открой дебаггер и посмотри какие значения принимают переменные. Это поможет тебе понять, в чём дело.

а где взять дебаггер? у меня был старый из твоих уроков по физиксу, но у меня стоит Windows 7 и он почему то не запускается, даже от администратора
(проблему с бесконечными поворотами я решил, но появились новые поэтому он бы мне помог)

baton4ik 04.12.2010 16:28

Ответ: кубик рубика
 
Не этот дебаггер. Поставь галочку у Program->Debug Enabled

WhiteBlack 04.12.2010 16:52

Ответ: кубик рубика
 
Цитата:

Сообщение от baton4ik (Сообщение 170856)
Не этот дебаггер. Поставь галочку у Program->Debug Enabled

а как это мне поможет, у меня же нет ошибки в синтаксе кода, она где то в логике
при повороте некоторые кубики имеют координаты по оси Х что то вроде 2,00445е-6.00
откуда это может браться?

baton4ik 04.12.2010 16:55

Ответ: кубик рубика
 
Вот это и надо смотреть дебаггером! Ставь брекпойнты и смотри значения переменных, таким образом ища логическую ошибку.

WhiteBlack 04.12.2010 20:27

Ответ: кубик рубика
 
Вложений: 1
вот что у меня получилось(во вложении)

так как код получился довольно большым, я не прошу вникать в код мне бы только узнать ваши предположения на счет появления координат у верхних кубиков
управление:
PHP код:

повороты по горизонтали:
P(англ)-влево       Х(русское)-вправо
Ж                        Э
Ю                        
,

по вертикали
U  и J
I и K
O и L 

попробуйте нажать "Х" несколько раз и посморите на координаты верхних кубиков там появляются странные координаты
(может это связано с припэрентиванием и отпэрениванием к пивотам??:dontknow: )

ABTOMAT 04.12.2010 20:29

Ответ: кубик рубика
 
WhiteBlack, ты делал то, что описано в посте №9 ?

WhiteBlack 04.12.2010 20:34

Ответ: кубик рубика
 
Цитата:

Сообщение от ABTOMAT (Сообщение 170887)
WhiteBlack, ты делал то, что описано в посте №9 ?

да, там какая то фигня извинюясь за выражение, дебаггер после нескольких поворотов говорит, что максимальное значение у из всех кубиков равно 520(хотя там же стоят кубики с Х=540), а "Y" становится 560 хотя должно быть 540

WhiteBlack 04.12.2010 21:16

Ответ: кубик рубика
 
полазил с дебаггером, нашел такую ерунду: после поворота ЗНАЧЕНИЕ координаты Y увеличивается на 10, при этом реальные координаты остаются прежними, то есть он никуда не сдвигается
при этом вспомнил, что у меня ест вот такая строчка
PHP код:

PositionEntity pivvertEntityX(cubes(5)), EntityY(cubes(5))+10EntityZ(cubes(5)) 

pivvert - это пивот, к которому припэрентиваются кубики
такое ощущение, что вот эта десятка прибавляется, но если ее не прибавлять, тогда пивот получается не по центру и кубики вращаются не точно
что то я не понал, если что то припэрентить, а потом отпэрентить, координаты вроде должны быть те же? или нет?

Crayzi 05.12.2010 22:39

Ответ: кубик рубика
 
Цитата:

Сообщение от WhiteBlack (Сообщение 170896)
что то я не понал, если что то припэрентить, а потом отпэрентить, координаты вроде должны быть те же? или нет?

Помойму блитз чуть неадэкватен в этом вопросе, юзай так - если хош глобальную координату то EntityX#(cubes(5),True), есди локальную то EntityX#(cubes(5),False).
Цитата из фака блитза:
Код:

EntityX# ( entity[,global] )
Параметры
entity = указатель объекта
global (не обязательно)= True для глобальных координат, False - для локальных. По умолчанию False.


RBK 06.12.2010 02:16

Ответ: кубик рубика
 
Запустил программу. После нескольких вращений кубик развалился.
Код слишком запутан. Попробуй вращать стороны с помощью отдельных
функций.

WhiteBlack 06.12.2010 15:17

Ответ: кубик рубика
 
Цитата:

Сообщение от Crayzi (Сообщение 171041)
если хош глобальную координату то EntityX#(cubes(5),True), есди локальную то EntityX#(cubes(5),False).

пробовал , не помогает он все равно разваливается через несколько поворотов:4to:

RBK 06.12.2010 16:31

Ответ: кубик рубика
 
Вероятно проблема с файлом rubik.3DS

Если убрать 26 кубиков, то видно что на нижней плоскости в середине один лишний кубик.

Но главное центр кубика расположен на его нижней гране, поэтому даже в одном и том-же месте у кубика могут быть разные координаты, в зависимости от поворота

WhiteBlack 06.12.2010 19:04

Ответ: кубик рубика
 
Цитата:

Сообщение от RBK (Сообщение 171119)
Вероятно проблема с файлом rubik.3DS

Если убрать 26 кубиков, то видно что на нижней плоскости в середине один лишний кубик.


спасибо, если честно я не понимаю откуда он взялся

Цитата:

Сообщение от RBK (Сообщение 171119)
Но главное центр кубика расположен на его нижней гране, поэтому даже в одном и том-же месте у кубика могут быть разные координаты, в зависимости от поворота

да действительно, когда создавал модельку, поставил центральному кубику координаты 0, 0, 0 и забыл, что в Блитце идет отсчет от центра:mad:
сейчас попробую исправить

WhiteBlack 06.12.2010 19:21

Ответ: кубик рубика
 
Вложений: 1
Поставил координаты от центра, удалил лишний кубик, но ничего не изменилось:dontknow:

RBK 06.12.2010 20:31

Ответ: кубик рубика
 
Изменились только координаты всей группы кубиков. При загрузке ты отделяешь кубик от всей группы. Но центр каждого маленького кубика все равно в середине нижней грани после отсоединения. Поэтому ничего не изменилось.

WhiteBlack 06.12.2010 22:24

Ответ: кубик рубика
 
Цитата:

Сообщение от RBK (Сообщение 171169)
Изменились только координаты всей группы кубиков. При загрузке ты отделяешь кубик от всей группы. Но центр каждого маленького кубика все равно в середине нижней грани после отсоединения. Поэтому ничего не изменилось.

блин странно, в максе координаты у каждого кубики были от центра, я все 26 проверил:4to:
ну хорошо пробую еще раз

WhiteBlack 06.12.2010 22:46

Ответ: кубик рубика
 
RBK, скажи пожалуйста, как ты определяешь, где находится центр у фигуры в Блитце, просто каждый раз выкладывать архив для проверки, я думаю это вам неприкольно.

RBK 06.12.2010 23:08

Ответ: кубик рубика
 
Я из кусков твоей программы сделал тестовую программу в которой поочередно вращаются маленькие кубики.
Вот это исправление загрузит кубики правильно:

Код:

Function FindAllKubes(mesh)

Local temp

  For i=1 To 26
    temp=FindChild(mesh, "Box"+i) ;ищем кубик
    EntityParent(temp, 0) ;отсоединяем
    cubes(i)=CreatePivot();Создаем центр для кубика

    ;Ставим туда где должен быть центр
    PositionEntity cubes(i), EntityX(temp), EntityY(temp)+10, EntityZ(temp)
               
    EntityParent(temp, cubes(i)) ;подсоединяем кубик

  Next
 
End Function


WhiteBlack 07.12.2010 12:59

Ответ: кубик рубика
 
Цитата:

Сообщение от RBK (Сообщение 171204)
Я из кусков твоей программы сделал тестовую программу в которой поочередно вращаются маленькие кубики.
Вот это исправление загрузит кубики правильно:

Код:

Function FindAllKubes(mesh)

Local temp

  For i=1 To 26
    temp=FindChild(mesh, "Box"+i) ;ищем кубик
    EntityParent(temp, 0) ;отсоединяем
    cubes(i)=CreatePivot();Создаем центр для кубика

    ;Ставим туда где должен быть центр
    PositionEntity cubes(i), EntityX(temp), EntityY(temp)+10, EntityZ(temp)
               
    EntityParent(temp, cubes(i)) ;подсоединяем кубик

  Next
 
End Function


странно, но это ничего не изменило, хотя идея хорошая, спасибо за мыслю:)

RBK 07.12.2010 14:01

Ответ: кубик рубика
 
Чтобы вращать весь куб или его часть нужен всего один пивот.
Код:

piv=CreatePivot();Создаем пивот для вращения
;Ставим в середину всего блока
PositionEntity piv, EntityX(cubes(5)), EntityY(cubes(10)), EntityZ(cubes(5))

Центры кубиков теперь не прыгают и нужно просто сравнить координаты чтобы найти нужные.Дальше найденные кубики присоединяем к piv. Вращаем piv в нужную сторону, отсоединяем кубики.

WhiteBlack 07.12.2010 17:18

Ответ: кубик рубика
 
Цитата:

Сообщение от RBK (Сообщение 171241)
Центры кубиков теперь не прыгают и нужно просто сравнить координаты чтобы найти нужные.Дальше найденные кубики присоединяем к piv.

хочешь сказать, что присоединять нужно кубики? или пивоты, к которым приперэнтины кубики??
просто я попробовал к piv присоединял пивоты центральные и все равно разваливается :4to:
может все таки ошибка где-то в логике? или ты говорил, что использовал где то мой код, там работало, да?:crazy:

RBK 07.12.2010 18:42

Ответ: кубик рубика
 
Я только сейчас заметил что ты переписал функции во втором варианте.
Зачем все так усложнять? Значение MaxY, MaxX и другие нужно определить только раз, в самом начале, а потом использовать.

Да присоединяй к piv центральные пивоты

WhiteBlack 07.12.2010 22:51

Ответ: кубик рубика
 
Цитата:

Сообщение от RBK (Сообщение 171275)
Я только сейчас заметил что ты переписал функции во втором варианте.
Зачем все так усложнять? Значение MaxY, MaxX и другие нужно определить только раз, в самом начале, а потом использовать.

да точно спасибо:super: , только это ничего не меняет:4to: :crazy: :4to:

вся проблема в координатах: у кубиков (теперь уже у пивотов) после поворота больше чем на 270 градусов (во время четвертого поворота) появляются непонятные координаты, это глюк Блица?!
(я решил проверить, взял просто кубик присоединил его к пивоту и повернул пивоту на 90 градусов, координаты кубика были (-5; 0; 5),а стали равны (5,96046е-007; 0; -4,76837Е-007) - ЧТО ЭТО??????
как с этим справиться?

Dream 08.12.2010 01:00

Ответ: кубик рубика
 
координаты глобальные берёшь?

RBK 08.12.2010 03:30

Ответ: кубик рубика
 
Цитата:

Сообщение от WhiteBlack (Сообщение 171306)
да точно спасибо:super: , только это ничего не меняет:4to: :crazy: :4to:

вся проблема в координатах: у кубиков (теперь уже у пивотов) после поворота больше чем на 270 градусов (во время четвертого поворота) появляются непонятные координаты, это глюк Блица?!
(я решил проверить, взял просто кубик присоединил его к пивоту и повернул пивоту на 90 градусов, координаты кубика были (-5; 0; 5),а стали равны (5,96046е-007; 0; -4,76837Е-007) - ЧТО ЭТО??????
как с этим справиться?

Проблема в том что координаты объектов заданы типом Float. Поворот не совсем точная операция, поэтому возможен разброс в несколько десятых.

Равенство двух чисел типа Float проверяют так:
if Abs(A#-B#) < (величина возможного разброса)

если условие выполняется числа A# и B# равны.

WhiteBlack 08.12.2010 17:12

Ответ: кубик рубика
 
все просто суперррр, Спасибо RBK
ты даже не представляешь как я тебе благодарен!!!!!
теперь все работает:)

RegIon 30.12.2010 05:58

Ответ: кубик рубика
 
Народ, не забываем, что координаты чаилдов, остаются как в редакторе, и направление такое-же.В максе вместо X-Z и т.д


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

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