Jump to content


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


  • Please log in to reply
11 replies to this topic

#1 djalex777

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

djalex777

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

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

Posted 25.02.09 - 23:00

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

#3 SOb Zemlja

SOb Zemlja

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

  • Главные администраторы
  • PipPipPipPip
  • 801 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

djalex777

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

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

Posted 26.02.09 - 19:55

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

#5 SOb Zemlja

SOb Zemlja

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

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

Posted 26.02.09 - 22:51

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

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

#6 Amaro

Amaro

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

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

Posted 27.02.09 - 12:22

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

#7 SOb Zemlja

SOb Zemlja

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

  • Главные администраторы
  • PipPipPipPip
  • 801 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

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

Zuba Zenovka

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

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

Posted 03.03.09 - 17:49

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

#10 djalex777

djalex777

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

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

Posted 18.03.09 - 16:05

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

#11 Web

Web

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

  • Пользователи
  • PipPip
  • 64 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-скриптинг и UI-дизайн. Дорого.

#12 highstaker

highstaker

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

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

Posted 19.03.12 - 17:33

warpPos( vector destpos )
{   //R&D by Keknehv Psaltery, 05/25/2006
	 //with a little poking by Strife, and a bit more
	 //some more munging by Talarus Luan
	 //Final cleanup by Keknehv Psaltery
	 //Changed jump value to 411 (4096 ceiling) by Jesse Barnett
	 // Compute the number of jumps necessary
	 integer jumps = (integer)(llVecDist(destpos, llGetPos()) / 10.0) + 1;
	 // Try and avoid stack/heap collisions
	 if (jumps > 411)
		 jumps = 411;
	 list rules = [ PRIM_POSITION, destpos ];  //The start for the rules list
	 integer count = 1;
	 while ( ( count = count << 1 ) < jumps)
		 rules = (rules=[]) + rules + rules;   //should tighten memory use.
	 llSetPrimitiveParams( rules + llList2List( rules, (count - jumps) << 1, count) );
	 if ( llVecDist( llGetPos(), destpos ) > .001 ) //Failsafe
		 while ( --jumps )
			 llSetPos( destpos );
}

Есть еще такая функция. Вроде пока работает.
Тока я никак не пойму КАК она работает.
Кстати, метод просто через llSetPrimitiveParams уже не работает. :( пичалько

UPDATE эта функция при значениях расстояния больше какого-то значения (около 2000 метров), выдает ошибку скрипта. Но шагать через два километра всё же быстрее чем через 10 метров.

UPDATE2 чуть больше чем 2000, где-то 2400 или около того.

UPDATE3 еще неприятность. эта функция почему-то отказывается работать больше одного раза без ресета. Прыгнуть со ста метров до 4000 в два шага не удалось - зависает на 2500. Причём вроде как скрипт продолжает работу, не останавливается и не выдаёт ошибку, но дальнейшее перемещение не происходит. Потом попробую над этим поработать... возможно придётся воспользоваться двумя скриптами.

UPDATE4 нашлось простое решение (не уверен насколько надёжное). скрипт у мя был скомпилирован в LSO. При включении моно сразу заработало. Правда почему-то с 20 метров на 4000 прыгать не хочет. А обратно прыгает. Странно...

Edited by highstaker, 20.03.12 - 17:37.





1 user(s) are reading this topic

0 members, 1 guests, 0 anonymous users