Создание и настройка моделей NPC - Страница 25 - Моделирование - AMK Team
Перейти к контенту

Создание и настройка моделей NPC


Senator

Рекомендуемые сообщения

Привет!Как перенести персонажа из игры на движке Source(типа css,half life,left 4 dead) в сталкер тч или чн/зп?

Ну, да поможет Вам F1, да сохранит Вас F2, во имя Control`а, Alt`а и святого Delet`а. Enter.

@Котошметик [YouTube]

привет! Долго и упорно допривязывая, что не привяжется от иного скелета (Source) к Сталкеру. Это если кратчайшим путем, либо полная перепривязка, делается в любом удобном 3Д редакторе. Знание Фотошопа, чтобы исходники для бампа сделать. Знание СДК с настройкой моделей и текстур. https://www.youtube.com/results?search_query=Привязка+меши+НПС+к+костям+сталкера

  • Спасибо 1
  • Полезно 1

ed_rez.gif

c1f11b67ff360413e81b4e4dcf21eb41.jpg

Пипл,хэлп!У меня после переноса монолитовца в тяжёлом бронекостюме из ЗП в ТЧ я словил вылет. Вот часть лога :

Скрытый текст

[error]Expression    : fatal error
[error]Function      : CSkeletonX::_Load
[error]File          : E:\stalker\sources\trunk\xr_3da\SkeletonX.cpp
[error]Line          : 380
[error]Description   : <no expression>
[error]Arguments     : Invalid vertex type in skinned model 'actors\neytral\stalker_neytral_balon_1:1'

Я делал по этому гайду.

Ну, да поможет Вам F1, да сохранит Вас F2, во имя Control`а, Alt`а и святого Delet`а. Enter.

Пытался перенести Лесника из ЧН в ТЧ (раньше переносил НПС из ЗП в ТЧ с ЗПшными анимками - работали), перегнал модель Лесника через СДК 0.4, анимки все в омф файле (от ЧН), в СДК анимки на НПС работают. Добавил анимки в mob_trader.script

Скрытый текст

----------------------------------------------------------------------------------------------------
-- mob_trader
----------------------------------------------------------------------------------------------------
global_animations = {
	desk_idle				= {"idle","idle_1","palci","zatylok"},
	desk_talk				= {"idle","idle_1"},
	desk_to_chair_hack		= {"idle_spinka"},
	desk_to_listen			= {"idle_chitaet"},
	desk_to_diagonal		= {"perehod_0"},
	
	chair_hack_idle			= {"idle_2","idle_2_def_0"},
	chair_hack_talk			= {"idle_2_talk_0","idle_2_talk_1","idle_2_talk_2","idle_2_talk_3"},
	chair_hack_to_diagonal	= {"idle_2_to_idle_0"},
	chair_hack_to_desk		= {"spinka_idle"},
	
	compute_idle				= {"idle_1_spec_think_0","idle_1_spec_think_1"},
	compute_idle_to_diagonal	= {"idle_1_to_idle_0"},
	
	diagonal_idle			= {"idle_0_def_0","idle_0_spec_click_0","idle_0_spec_scratch_0"},
	diagonal_idle_short		= {"idle_0_def_0"},
	diagonal_talk			= {"idle_0_talk_0","idle_0_talk_1","idle_0_talk_2","idle_0_talk_3"},
	diagonal_to_chair_hack	= {"idle_0_to_idle_2"},
	diagonal_to_compute		= {"idle_0_to_idle_1"},
	diagonal_to_desk		= {"perehod_1"},
		
	first_phrase			= {"vstuplenie"},
	
	listen_idle				= {"chitaet"},
	listen_to_desk			= {"chitaet_idle"},
	
	hello				= {"hello"},

	forester_sit                 = {"sit"},
    forester_beard                = {"beard_in","beard","beard_out"},
    forester_reaction        = {"reaction_in","reaction","reaction_out"},
    forester_see                = {"see_in","see","see_out"},
    forester_talk_1                = {"sit_talk_1_in","sit_talk_1","sit_talk_1_out"},
    forester_talk_2                = {"sit_talk_2_in","sit_talk_2","sit_talk_2_out"},
    forester_talk_3                = {"sit_talk_3_in","sit_talk_3","sit_talk_3_out"}	
}

head_animations = {
	normal			= {"talk_0","talk_1","talk_4"}, 
	angry			= {"talk_3","talk_2","talk_1"},
	good			= {"talk_glad_0"},
	first_phrase	= {"vstuplenie_head"},
	forester_talk_1    		= {"sit_talk_1_in","sit_talk_1","sit_talk_1_out"},
	forester_talk_2    = {"sit_talk_2_in","sit_talk_2","sit_talk_2_out"},
	forester_talk_3    = {"sit_talk_3_in","sit_talk_3","sit_talk_3_out"},
	forester_reaction        = {"reaction_in","reaction","reaction_out"}
}

----------------------------------------------------------------------------------------------------
function on_start_tutorial_item_1()
	if db.trader == nil then return end
	
	db.trader:external_sound_start("characters_voice\\scenario\\trader\\trader_tutorial_pda_12")
end

function on_stop_tutorial_item()
	if db.trader == nil then return end
	db.trader:external_sound_stop()
end
----------------------------------------------------------------------------------------------------

class "mob_trader"

function mob_trader:__init(obj, storage)
	self.object = obj
	self.st		= storage
end

function mob_trader:reset_scheme()
	trader_obj = self.object

	self.st.signals = {}
	
	self.object:set_callback(callback.trader_global_anim_request, self.on_global_anim_request, self )
	self.object:set_callback(callback.trader_head_anim_request, self.on_head_anim_request, self )
	self.object:set_callback(callback.trader_sound_end, self.on_sound_end, self )

	-- start global animation
	self.object:set_trader_global_anim(self:select_global_animation())
	
	-- start sound and head animation
	if (self.st.sound_phrase) then 
		local snd = mob_sound.pick_sound_from_set(self.object, self.st.sound_phrase, {})
		self.object:set_trader_sound(snd, self:select_head_animation());
	end
	
	if self.st.anim_head == nil then
		self.st.anim_head = "normal"
	end
	
	db.trader = self.object
end

function mob_trader:update(delta)
	if xr_logic.try_switch_to_another_section(self.object, self.st, db.actor) then
		return
	end
end

---------------------------------------------------------------------------------------------------------------------
function mob_trader:select_global_animation()
	local anim_set = global_animations[self.st.anim_global]
    local r = math.random(1, table.getn(anim_set))
	return anim_set[r]
end

function mob_trader:select_head_animation()
	-- random select 
	local anim_set = head_animations[self.st.anim_head]
    local r = math.random(1, table.getn(anim_set))
	return anim_set[r]	
end

---------------------------------------------------------------------------------------------------------------------

function mob_trader:on_global_anim_request()
	self.st.signals["animation_end"] = true	
	
	if (not self.st.play_once) then
		self.object:set_trader_global_anim(self:select_global_animation())
	end
end

function mob_trader:on_head_anim_request()
	if self.st.anim_head == nil then return end
		
	self.object:set_trader_head_anim(self:select_head_animation());
end

function mob_trader:on_sound_end()
	self.st.signals["sound_phrase_end"] = true	
end
---------------------------------------------------------------------------------------------------------------------
function mob_trader:deactivate()
	self.object:set_callback(callback.trader_global_anim_request, nil )
	self.object:set_callback(callback.trader_head_anim_request, nil )
	self.object:set_callback(callback.trader_sound_end, nil )
	self.st.signals = {}
	db.trader		= nil
end

---------------------------------------------------------------------------------------------------------------------
function add_to_binder(npc, ini, scheme, section, storage)
	printf("DEBUG: add_to_binder: npc:name()='%s', scheme='%s', section='%s'", npc:name(), scheme, section)

	local new_action = mob_trader(npc, storage)

	-- Зарегистрировать все actions, в которых должен быть вызван метод reset_scheme при изменении настроек схемы:
	xr_logic.subscribe_action_for_events(npc, storage, new_action)
end

function set_scheme(npc, ini, scheme, section, gulag_name)
	local st	= xr_logic.assign_storage_and_bind(npc, ini, scheme, section)
	st.logic	= xr_logic.cfg_get_switch_conditions(ini, section, npc)

	st.anim_global    = utils.cfg_get_string(ini, section, "anim_global", npc, true,  "")
	st.can_talk		  = utils.cfg_get_bool(ini,   section, "can_talk",    npc, false, true)
	st.tip_text		  = utils.cfg_get_string(ini, section, "tip_text",    npc, false, "", "character_use")
	if st.tip_text == nil then
		st.tip_text = ""
	end
	npc:set_tip_text(st.tip_text)
	
	if (ini:line_exist( section, "sound_phrase")) then
		st.anim_head	= utils.cfg_get_string(ini, section, "anim_head", npc, false, "")
		st.sound_phrase	= utils.cfg_get_string(ini, section, "sound_phrase", npc, false, "")
	else
		st.anim_head	= nil
		st.sound_phrase	= nil
	end
	
	
	--' check if play once animation
	st.play_once = false
	if (ini:line_exist( section, "on_signal")) then
		local str = utils.cfg_get_string(ini, section, "on_signal", npc, false, "")
		local par = utils.parse_params(str)
		if par[1] == "animation_end" then
			st.play_once = true
		end
	end

	if st.can_talk == true then
		npc:enable_talk()
	else
		npc:disable_talk()
	end
	
end

 

Спавню в игре и получаю вылет!

Скрытый текст

Expression    : motion_ID.valid()
Function      : CKinematicsAnimated::ID_Cycle
File          : E:\stalker\sources\trunk\xr_3da\SkeletonAnimated.cpp
Line          : 136
Description   : ! MODEL: can't find cycle:
Arguments     : sit

Но анимация "sit" есть в омф и в СДК играет! Пробовал другие анимки - тоже такой вылет.

Внимание! Лесник не НПС, а моб (как Сидорович в ТЧ).

Подскажите в чем кроется ошибка?

Изменено пользователем Graff46
2 минуты назад, Graff46 сказал:

перегнал модель Лесника через СДК 0.4

Просто перегнал или перед этим изменил скелет на ТЧ-шный? (Вопрос может быть и ответом)

ed_rez.gif

c1f11b67ff360413e81b4e4dcf21eb41.jpg

@ed_rez, Не менял

 

@ed_rez, Моя не внимательность меня погубит! Спавнил Лесника, а скин Сидора был, хотя в секции менял, а как через нет-пакет сменил, так сразу!

8f49c475e4b23341738125991e149aff.jpg

17 минут назад, Graff46 сказал:

Не менял

Тогда это объясняет:

29 минут назад, Graff46 сказал:

Лесник не НПС, а моб (как Сидорович в ТЧ).

Странно, а я помню Лесника стоящим и двигающимся у какой-то избушки. Видимо был перенос на сталкерский скелет. 

ed_rez.gif

c1f11b67ff360413e81b4e4dcf21eb41.jpg

9 минут назад, ed_rez сказал:

Тогда это объясняет:

Зачем менять скелет, если я омф из ЧН использую  (родную)?

@Graff46

тогда смысл перегонять в СДК? Дописать другие файлы настроек косточек?

Мне, к примеру, без разницы в каком СДК компилить модель для ТЧ. Это и ввело меня в путаницу, да еще и думал про сталкерский скелет.

ed_rez.gif

c1f11b67ff360413e81b4e4dcf21eb41.jpg

23 часа назад, ed_rez сказал:

тогда смысл перегонять в СДК?

Ну как минимум - шейдер поменять.

 

Мать: ASRock X470 Master SLI. Процессор: AMD Ryzen 9 3900X 12-Core(4200 MHz).
Память: Patriot Memory 3200 C16 Series. DDR4-3200(1600МГц), 16Гбх2(32Гб).
Видео: GeForce GTX 1060 6GB. Блок питания: CoolerMaster 750 Вт. Корпус: Zalman i3 Edge.

Химера конечно сильный хищник, а все держится дома. Чего же ты пришел к ней домой и пытаешься её убить? © Болотный Доктор

@Romann

и то верно, причем сам же когда-то об этом и писал. 

ed_rez.gif

c1f11b67ff360413e81b4e4dcf21eb41.jpg

Логику персонажа смотри. 

http://stalkerin.gameru.net/wiki/index.php?title=Настройка_логики._Часть_1

Изменено пользователем ed_rez
  • Спасибо 1

ed_rez.gif

c1f11b67ff360413e81b4e4dcf21eb41.jpg

ИМХО до кучи пути в спавне нужно смотреть.

А по логике - анимки как анимки. Ничего необычного...Всё как у сталкеров))

Изменено пользователем Змея
В 07.01.2019 в 04:25, ed_rez сказал:

Мне, к примеру, без разницы в каком СДК компилить модель для ТЧ.

У тебя движек альтернативный? Или есть способ компилить НПС в 0.7 для ТЧ?

Do what thou wilt shall be the whole of the Law.

@sto1en

тут не важно какой движок. Важны настройки текстур, а именно шейдеров. Скелет ТЧ отлично съедается СДК ЗП. Галочка HQ geometry не вызывает конфликтов в ТЧ движке. Настройки костей универсальны.

ed_rez.gif

c1f11b67ff360413e81b4e4dcf21eb41.jpg

Я компилировал в 0.7 модель под ТЧ. Настройки шейдеров как в 0.4. Скелет - universal.bones подгружал. Компилирует без проблем, но в игре вылет

CSkeletonX::_Load Invalid vertex type in skinned model '%s' , увы.

Do what thou wilt shall be the whole of the Law.

Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий

Комментарии могут оставлять только зарегистрированные пользователи

Создать аккаунт

Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!

Зарегистрировать новый аккаунт

Войти

Есть аккаунт? Войти.

Войти
  • Недавно просматривали   0 пользователей

    • Ни один зарегистрированный пользователь не просматривает эту страницу.
×
×
  • Создать...