Jump to content


llSetPos - ограничения передвижения?


  • You cannot reply to this topic
10 replies to this topic

#1 djalex777

    Новичок на форуме

  • Пользователи
  • PipPip
  • 41 posts
  • Пол:М
  • Основной цех:Скриптеры
  • Второй цех:Строители
  • SL Status: 

Posted 24.02.09 - 23:23

Есть территория. Ровное поле. Посередине лежит плита высотой 20 метров. На плите находится сфера с именем SPHERE.
Создал объект куб (фантомный, не физический). В нем написал скрипт - при нажатии на куб он ищет объект SPHERE, вычисляет его координаты и двигается к нему с помощью функции:
...
object_move_to(vector position) {
	vector last;
	do {
		last = llGetPos();
		llSetPos(position);  
	} while ((llVecDist(llGetPos(),position) > 0.001) && (llGetPos() != last));
}
...

Но объект доходит до плиты и останавливается. Почему он не летит дальше, не долетает до SPHERE??? Расстояние не большое.

#2 djalex777

    Новичок на форуме

  • Пользователи
  • PipPip
  • 41 posts
  • Пол:М
  • Основной цех:Скриптеры
  • Второй цех:Строители
  • SL Status: 

Posted 25.02.09 - 23:00

Обнаружил такуюже проблему при следующих условиях. На симе есть две территории - на одной разрешен llRezObject, на другой запрещен. Делаю llRezObject на территории где это разрешено, и двигаю объект (llSetPos) в сторону территории где llRezObject запрещен. Объект останавливается на границе этих двух территорий и не "идет" дальше. Это так и задумано? Или это баг?

#3 SOb Zemlja

    Активный участник

  • Главные администраторы
  • PipPipPipPip
  • 791 posts
  • Пол:М
  • Откуда:Россия, Москва
  • Основной цех:Строители
  • Второй цех:Скриптеры
  • SL Status: 

Posted 25.02.09 - 23:03

View Postdjalex777, on 24.2.2009, 23:23, said:

Есть территория. Ровное поле. Посередине лежит плита высотой 20 метров. На плите находится сфера с именем SPHERE.
Создал объект куб (фантомный, не физический). В нем написал скрипт - при нажатии на куб он ищет объект SPHERE, вычисляет его координаты и двигается к нему с помощью функции:
...
object_move_to(vector position) {
	vector last;
	do {
		last = llGetPos();
		llSetPos(position);  
	} while ((llVecDist(llGetPos(),position) > 0.001) && (llGetPos() != last));
}
...

Но объект доходит до плиты и останавливается. Почему он не летит дальше, не долетает до SPHERE??? Расстояние не большое.

А если плита тоже фантомная, всё равно останавливается?

#4 djalex777

    Новичок на форуме

  • Пользователи
  • PipPip
  • 41 posts
  • Пол:М
  • Основной цех:Скриптеры
  • Второй цех:Строители
  • SL Status: 

Posted 26.02.09 - 19:55

Разобрался.
По первому случаю - видимо был какой-то лаг. Перепроверил - в пределах одного парсела не физический объект перемещается нормально, даже если плита не фантомная и он сам не фантомный.
По второму - объект (как физический так и кинематический) может перемещаться только в пределах парсела (ов) на которых разрешен llRezObject!

#5 SOb Zemlja

    Активный участник

  • Главные администраторы
  • PipPipPipPip
  • 791 posts
  • Пол:М
  • Откуда:Россия, Москва
  • Основной цех:Строители
  • Второй цех:Скриптеры
  • SL Status: 

Posted 26.02.09 - 22:51

View Postdjalex777, on 26.2.2009, 19:55, said:

Разобрался.
По первому случаю - видимо был какой-то лаг. Перепроверил - в пределах одного парсела не физический объект перемещается нормально, даже если плита не фантомная и он сам не фантомный.
По второму - объект (как физический так и кинематический) может перемещаться только в пределах парсела (ов) на которых разрешен llRezObject!

Спасибо.

#6 Amaro

    Новичок на форуме

  • Пользователи
  • PipPip
  • 36 posts
  • Основной цех:Строители
  • Второй цех:Скриптеры
  • SL Status: 

Posted 27.02.09 - 12:22

Объект должен мочь залетать в парселы, где нет реза, при условии, что на парселе поднят флаг Object Entry для всех (либо для группы и объект под этой группой). Перемещать примы через сетпоз стоит шагами, не больше 10 метров. Если шагать больше, то оно как-то неустойчиво работало - может шагнуть, а может и передумать. Но это давно было, не знаю, что сейчас.

#7 SOb Zemlja

    Активный участник

  • Главные администраторы
  • PipPipPipPip
  • 791 posts
  • Пол:М
  • Откуда:Россия, Москва
  • Основной цех:Строители
  • Второй цех:Скриптеры
  • SL Status: 

Posted 27.02.09 - 12:33

View PostAmaro, on 27.2.2009, 12:22, said:


Перемещать примы через сетпоз стоит шагами, не больше 10 метров. Если шагать больше, то оно как-то неустойчиво работало - может шагнуть, а может и передумать. Но это давно было, не знаю, что сейчас.

В LSL Wiki и сейчас написано, что „Limited to moving no more than 10m per call in any direction“, так что наверное ограничение актуально.

#8 djalex777

    Новичок на форуме

  • Пользователи
  • PipPip
  • 41 posts
  • Пол:М
  • Основной цех:Скриптеры
  • Второй цех:Строители
  • SL Status: 

Posted 27.02.09 - 13:41

Amaro said:

Объект должен мочь залетать в парселы, где нет реза, при условии, что на парселе поднят флаг Object Entry для всех (либо для группы и объект под этой группой)

Да, я забыл это написать. Спасибо.
По-поводу перемещения - с помощью llSetPos объект будет перемещаться за один раз не далее чем на 10 метров. Т.е. например мы находимся в координате 0,0,0. Вызываем llSetPos(100,0,0). После одного вызова объект будет в точке (10,0,0). Для того что бы переместить объект в какую-либо точку можно использовать функцию описанную в самом начале темы.

#9 Zuba Zenovka

    Новичок на форуме

  • Пользователи
  • PipPip
  • 55 posts
  • Пол:М
  • SL Status: 

Posted 03.03.09 - 17:49

Через llSetPrimitiveParams можно переместить объект и на 100 за один шаг... и дальше.

#10 djalex777

    Новичок на форуме

  • Пользователи
  • PipPip
  • 41 posts
  • Пол:М
  • Основной цех:Скриптеры
  • Второй цех:Строители
  • SL Status: 

Posted 18.03.09 - 16:05

При attachment ограничение на позицию не более 3.2 метра от точки аттача или я что-то не так делаю?

#11 Web

    Новичок на форуме

  • Пользователи
  • PipPip
  • 60 posts
  • Пол:М
  • Откуда:Харьков
  • Основной цех:Скриптеры
  • Второй цех:Строители
  • SL Status: 

Posted 09.07.10 - 13:30

Попробуйте вот так:

posJump(vector target){
 llSetLinkPrimitiveParamsFast(!!llGetLinkNumber(), [PRIM_POSITION, <1.304382E+19, 1.304382E+19, 0.0>, PRIM_POSITION, target, PRIM_POSITION, llGetPos(), PRIM_POSITION, target]);
}


Называется этот трюк PosJump. Его обещались пофиксить уже давно... И обещаются до сих пор. Так что пока что можно пользоваться.
Кодю на LSL. Гадаю по звёздам. Ловлю крабов в заливе. Дорого.