Get it on Google Play


Wm뮤 :: '분류 전체보기' 카테고리의 글 목록 (12 Page)

블로그 이미지
가끔 그림그리거나 3D모델링하거나
취미로 로봇만드는
전자과 게임프로그래머 (퇴사함)
2022.3.22f1 주로 사용
모카쨩
@Ahzkwid

Recent Comment

Archive


2024. 8. 23. 06:30 Unity/C#


Root를 제외한 경로반환

v1 ~ v3

더보기


가령 Root/armature/Hips는 /armature/Hips가 된다

string ArmaturePath(Transform bone)
{
    var rootName = bone.transform.root.name;
    var hierarchyPath = bone.transform.GetHierarchyPath();
    return hierarchyPath.Substring(rootName.Length, hierarchyPath.Length - rootName.Length);
}

 

 


Root를 제외한 경로반환 v2 (상대경로)

인자를 하나 더 받고 안정성을 높였다

https://gist.github.com/ahzkwid/c89b626c0e7bace5cc317901b524672e

static string RelativePath(Transform target, Transform root = null)
{
    var rootName = "";
    var hierarchyPath = "";


    if (root != null)
    {
        try
        {
            rootName = SearchUtils.GetHierarchyPath(root.gameObject, false);

        }
        catch (System.Exception ex)
        {
            Debug.LogError(ex);
            Debug.LogError(root.ToString() + "nothing root");
            //Debug.LogError(bone.name + "는 root가 없음");
            throw;
        }
    }
    try
    {
        //hierarchyPath = bone.GetHierarchyPath();
        hierarchyPath = SearchUtils.GetHierarchyPath(target.gameObject, false);
    }
    catch (System.Exception ex)
    {
        Debug.LogError(ex);
        Debug.LogError(target.ToString() + "nothing GetHierarchyPath");
        throw;
    }

    var startIndex = rootName.Length;

    return hierarchyPath.Substring(startIndex, hierarchyPath.Length - startIndex);
}

 

v3

static string RelativePath(Transform target, Transform root = null)
{
    var rootName = "";
    var hierarchyPath = "";


    if (root != null)
    {
        try
        {
            rootName = SearchUtils.GetHierarchyPath(root.gameObject, false);

        }
        catch (System.Exception ex)
        {
            Debug.LogError(ex);
            Debug.LogError(root.ToString() + "nothing root");
            //Debug.LogError(bone.name + "는 root가 없음");
            throw;
        }
    }
    try
    {
        //hierarchyPath = bone.GetHierarchyPath();
        hierarchyPath = SearchUtils.GetHierarchyPath(target.gameObject, false);
    }
    catch (System.Exception ex)
    {
        Debug.LogError(ex);
        Debug.LogError(target.ToString() + "nothing GetHierarchyPath");
        throw;
    }

    var startIndex = rootName.Length;

    if (rootName.Length > hierarchyPath.Length)
    {
        Debug.LogWarning("rootName.Length > hierarchyPath.Length");
        Debug.LogWarning($"{rootName} > {hierarchyPath}");
        return null;
    }

    if (hierarchyPath.Substring(0, rootName.Length) != rootName)
    {
        Debug.LogWarning("hierarchyPath.Substring(0, rootName.Length) != rootName");
        Debug.LogWarning($"{rootName} != {hierarchyPath}.Substring(0, rootName.Length)");
        return null;
    }

    try
    {
        return hierarchyPath.Substring(startIndex, hierarchyPath.Length - startIndex);
    }
    catch (System.Exception ex)
    {
        Debug.LogError(ex);
        Debug.LogError($"{hierarchyPath} - {rootName}");
        throw;
    }
}

 

 

v4

경우에 따라 앞에 슬래시는 없애도 된다

var relativePath = "/"+Path.GetRelativePath(rootpath, path);

 

 

 

 

 

 

하이어라키 경로 반환

var path = SearchUtils.GetHierarchyPath(gameObject, false);

 

 

 

패스 병합

Replace 붙은 이유는 유니티는 '/'를 쓰는데 일부 로직에서 '\'를 인식 못하기 때문

var path = Path.Join(parentPath, childPath).Replace("\\", "/");

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

'Unity > C#' 카테고리의 다른 글

OnSceneGUI 관련코드  (0) 2024.07.11
유니티 라이트 레졸루션 개별설정  (0) 2024.05.12
유니티 프리팹 드래그 드랍  (0) 2024.05.09
posted by 모카쨩
2024. 8. 22. 19:14 게임/VRChat

공식문서 : https://creators.vrchat.com/sdk/build-pipeline-callbacks-and-interfaces/

 

https://gist.github.com/ahzkwid/38df2817c709ace268d843ecba7a7f95

 

VRChat/VRCBuildProcessor

VRChat/VRCBuildProcessor. GitHub Gist: instantly share code, notes, and snippets.

gist.github.com

 

using System.Reflection;
using UnityEngine;
using VRC.SDK3A.Editor;
using VRC.SDKBase;
using VRC.SDKBase.Editor.BuildPipeline;

public class VRCBuildProcessor : IVRCSDKBuildRequestedCallback, IVRCSDKPreprocessAvatarCallback
{
    public bool OnPreprocessAvatar(GameObject avatarGameObject)
    {
        Debug.Log($"PreprocessAvatar.{System.DateTime.Now}");
        return true;
    }
    public int callbackOrder => 0;

    public bool OnBuildRequested(VRCSDKRequestedBuildType requestedBuildType)
    {
        Debug.Log($"BuildRequested.{System.DateTime.Now}");

        //선택된 아바타
        VRC_AvatarDescriptor selectedAvatar = null;
        {
            var fieldInfo = typeof(VRCSdkControlPanelAvatarBuilder).GetField("_selectedAvatar", BindingFlags.Static | BindingFlags.NonPublic);
            selectedAvatar = (VRC_AvatarDescriptor)fieldInfo.GetValue(null);
        }



        VRCSdkControlPanelAvatarBuilder builder = null;
        {
            var fieldInfo = typeof(VRCSdkControlPanelAvatarBuilder).GetField("_instance", BindingFlags.Static | BindingFlags.NonPublic);
            builder = (VRCSdkControlPanelAvatarBuilder)fieldInfo.GetValue(null);
        }

        builder.OnSdkBuildStart -= BuildStart;
        builder.OnSdkBuildProgress -= BuildProgress;
        builder.OnSdkBuildFinish -= BuildFinish;
        builder.OnSdkBuildSuccess -= BuildSuccess;

        builder.OnSdkBuildStart += BuildStart;
        builder.OnSdkBuildProgress += BuildProgress;
        builder.OnSdkBuildFinish += BuildFinish;
        builder.OnSdkBuildSuccess += BuildSuccess;


        void BuildStart(object sender, object target)
        {
            Debug.Log($"BuildStart.{System.DateTime.Now}");
        }

        void BuildProgress(object sender, string status)
        {
            Debug.Log($"BuildProgress.{System.DateTime.Now}");
            builder.OnSdkBuildProgress -= BuildProgress;
        }
        void BuildFinish(object sender, string status)
        {
            Debug.Log($"BuildFinish.{System.DateTime.Now}");
            builder.OnSdkBuildFinish -= BuildFinish;
        }

        void BuildSuccess(object sender, string path)
        {
            Debug.Log($"BuildSuccess.{System.DateTime.Now}");
            builder.OnSdkBuildSuccess -= BuildSuccess;
        }
        // 빌드를 계속 진행하려면 true, 중단하려면 false를 반환합니다.
        return true;
    }
}

 

using System;
using System.Threading.Tasks;

namespace VRC.SDKBase.Editor
{
    /// <summary>
    /// This is the public interface you, as a user of the SDK, can use to interact with the SDK Builder
    /// </summary>
    public interface IVRCSdkBuilderApi: IVRCSdkControlPanelBuilder
    {
        // Build Events
        event EventHandler<object> OnSdkBuildStart;
        event EventHandler<string> OnSdkBuildProgress;
        event EventHandler<string> OnSdkBuildFinish;
        event EventHandler<string> OnSdkBuildSuccess;
        event EventHandler<string> OnSdkBuildError;

        event EventHandler<SdkBuildState> OnSdkBuildStateChange;
        SdkBuildState BuildState { get; }

        // Upload Events
        event EventHandler OnSdkUploadStart;
        event EventHandler<(string status, float percentage)> OnSdkUploadProgress;
        event EventHandler<string> OnSdkUploadFinish;
        event EventHandler<string> OnSdkUploadSuccess;
        event EventHandler<string> OnSdkUploadError;

        event EventHandler<SdkUploadState> OnSdkUploadStateChange;
        SdkUploadState UploadState { get; }

        // Shorthand methods
        // for shorthand build and upload methods check the Avatars and Worlds SDKs respectively
        void CancelUpload();
    }
    
    public enum SdkBuildState
    {
        Idle,
        Building,
        Success,
        Failure
    }

    public enum SdkUploadState
    {
        Idle,
        Uploading,
        Success,
        Failure
    }
}

 

모든 이벤트는 이렇게 된다

 

 

namespace VRC.SDK3A.Editor
{
    public class VRCSdkControlPanelAvatarBuilder : IVRCSdkAvatarBuilderApi
    {
        private const int MAX_ACTION_TEXTURE_SIZE = 256;

        protected VRCSdkControlPanel _builder;
        protected VRC_AvatarDescriptor[] _avatars;
        protected static VRC_AvatarDescriptor _selectedAvatar;
        private static VRCSdkControlPanelAvatarBuilder _instance;

 

중요관련 변수들

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

'게임 > VRChat' 카테고리의 다른 글

VRChat 제스처 매니저 단점  (0) 2024.08.29
VRChat 업로드 불가문제 모음  (1) 2024.07.23
캐릭터별 의상 대응방법  (0) 2024.05.17
posted by 모카쨩
2024. 8. 15. 20:28 게임분석

 

2024-08-15 통계

 

 

 

 

 

 

 

 

 

 

 

 

 

 

'게임분석' 카테고리의 다른 글

구글플레이 2024년 개발자 계정 확인  (0) 2024.09.30
진압방패 모음  (0) 2023.09.03
FPS 관련 자료  (0) 2023.08.21
posted by 모카쨩
2024. 8. 14. 15:15 사용설명서

 

 

 

https://new.express.adobe.com/tools/generate-qr-code

 

Adobe Express

 

new.express.adobe.com

 

 

여기서 링크넣고 다운로드 누르면 끝이다

 

'사용설명서' 카테고리의 다른 글

트위터 블루 인증  (0) 2024.09.01
윈10 복구 USB 만드는법  (0) 2024.08.11
카톡 감옥 방지, 예방  (0) 2024.08.09
posted by 모카쨩
2024. 8. 11. 20:28 사용설명서

 

 

 

https://www.microsoft.com/ko-kr/software-download/windows10

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

'사용설명서' 카테고리의 다른 글

QR코드 생성기  (0) 2024.08.14
카톡 감옥 방지, 예방  (0) 2024.08.09
주모니터 설정  (0) 2024.07.16
posted by 모카쨩
2024. 8. 10. 19:01 이 세계의 법칙

 

 

 

진화란 발전이 아니라 적응이다

무슨말이냐 하면 진화를 통해 결점이 발달할수도 있다는것이다

 

무슨 개소리냐 진화는 그런식으로 작동하지 않는다라고 말하는 사람들도 있었지만 이건 팩트다

디지몬 진화에 익숙해진 나머지 진화가 항상 발전되는 방향으로만 이루어지는 경우만 있는것으로 알고 있는 사람이 많지만

진화는 그렇지 않다는것이다

때론 결점이 발달됨으로서 환경에 적응하기 쉬워진다는것이다

그렇게 인류가 얻은 결점을 알아보겠다

 

 

 

 

1. 사랑니

너무 유명한 이야기다

일반적으로 불에 익혀먹는것으로 인해 사랑니가 생겼다고 하지만

반만 맞는 이야기다

정확히는 유형성숙한 개체가 이성에게 더 호감을 끌기 때문에 발생한 현상이다

유형성숙이란 무엇이냐 유아기 상태 그대로 성인이 되는현상을 말한다

그러니까 턱이 작아야 어려보이고 어려보여야 자손을 볼 확률이 높기 때문이다

 

아니 시방 그러면 다른 동물들도 사랑니 겪어야 하는거 아니여? 할지도 모른다

맞는말이다. 그러나 이 유형성숙에 장벽이 되던것은 생존에 불리한 형질이기 때문이였다.

턱주가리가 작아져서 소화불량이 오고 사랑니때문에 썩고 지랄나서 사냥도 집중 못하고 병걸리는등으로 생존에 악영향을 끼친다면? 당연히 도태되고 턱주가리가 작아지는 일따윈 없었을것이다.

하지만 보자 인간은 불을 사용해서 소화가 좋게 만들고 사냥도 창이면 너도나도 한방 생존에 악영향을 끼치는 요소가 배제되니 자연스레 턱주가리가 작아질수 있었다.

그리고 이 어려보인다라는것은 대가리 크기에도 영향을 줬다. 

대가리가 커야 어려보이니까 몰론 대가리가 크면 지능상승확률도 높아지니 그쪽도 영향이 있었을것이다

(지능에는 신경망 구조와 학습데이터가 더 중요하긴 했다만, 더 많은 신경망구조 탑재가 가능해진다)

 

그럼 왜 어려보이는 개체가 선호 되었느냐

당연히 어린 개체는 최신기종일 확률이 높고, 그러다보니 유용한 유전자를 가지고 있을 확률이 높기 때문이다.

그리고 어린아이를 좋아하는 개체가 자신의 아이를 적극적으로 보호할 확률이 높다.

 

그런데 이 유형성숙은 또 다른 단점들을 가져왔다

그것은 바로

 

2. 축농증 (부비동염)

사람의 부비동은 진짜 병신같이 생겼다

특히 상악동이 제일 거지같이 생겼다

아래에서 위로 나있어서 염증이 생기면 농이 빠지지 않고 고여있는것이다

정말 개병신같은 디자인이 따로없다

그런데 처음부터 이렇게 생긴건 아니였다는것이다

 

원랜 거의 수평에 가깝게 되어있어 섬모를 통해 쉽게 빠지도록 되어 있었다는것이다

그런데 유형선호로 인해 턱주가리가 작아지면서 모양이 거지같이 되어버렸다

예를들면 말의 경우에는 상악동이 이렇게 수평으로 되어있다

 

엥? 그럼 자연에 의해 도태되어야 하는거 아니냐고?

일반적인 동물이였다면 그랬다

사람이 기침 좀 한다고 뒤지지는 않으니까 걍 남은거다. 위에 말한대로 이 찌그러진 턱주가리가 자손을 남길 가능성이 더 높았기 때문이다

 

그런데!

 

여기서 끝이 아니다 이 찌그러진 대가리는 또 다른 결점을 진화시키고 말았다

 

 

3. 근시

근시 하면 보통 어두운곳에서 책읽어서 그렇다~ 어릴때 책을 너무 가까이서 봐서 어쩌구~ 하지만

틀리다
그랬으면 책은 갖다 던져버리고 컴퓨터 중독인 현대인들은 밝은 모니터로 인해 원시가 왔어야 했다

실제로는 대다수의 근시가 안구가 길어서 발생한다

다른 동물 같았으면 근시가 있으면 사냥을 못하니까 바로 뒤져버리고 자손을 남길수 없다

그런데 사람은 근시 좀 있다고 굶어죽지 않는다

오히려 대가리가 많이 압착되어 어려보이면 이성에게 호감사기 좋다

특히 이 일은 현대에 와서 심해졌다

어차피 안경이나 렌즈끼면 되거든

안경이 좀 못생긴거 빼고는 근시페널티가 전혀 없다
게다가 요샌 라식이나 라섹도 있다

그러다보니 오히려 얼굴이 평평하고 턱이 작을수록 어려보이니까 강점이 된다.

게다가! 현대에는 50년간 평균수명이 10년이 늘어날정도로 어려보이는 개체가 선호가 된다

엥? 수명이 긴 개체가 어려보이는거랑 무슨 상관이냐고?

수명이 긴 개체는 노화도 늦게 오고 어려보이니 이성에게 호감을 사기 쉬워진다

이 결혼과 평균수명에 관련된 이야기는 

늦은 결혼이 평균수명을 늘린다

위 링크에서도 소개중이니 읽어보면 좋다

 

 

4. 척추측만증

이거도 유명한 이야기다

원래 서있으라고 만들어진게 아니다

그런데 잘 서서 잘 뛰어다니고 도구 잘 다루는 사람이 생존확률이 높았다

그런데 그렇다고 통뼈가 되면 유연성이 사라져서 걍 이대로 살다가 개박살나버리는것이다

그래도 진화를 통해 2세를 볼 나이까지는 왠만해선 척추에 문제가 없도록 강화되었다

 

 

 

 

 

 

-결론

위 결점들은 모두 진화를 통해 강화되고 있다는것이다

왜?

이 결점이라는것은 어디까지나 우리들 기준에서 봤을때나 그렇지

자연이 봤을때는 이 결점들을 강화시키는 쪽이 자손을 유지시킬 확률이 더 높기 때문으로

즉 이 결점이야 말로 진화라는 관점이서는 실보다 득이 더 크기 때문이다

 

 

 

 

다 쓰고보니 이런거 정리해둔 책도 있더라

 이 책에 관심있으면 이 기사도 읽어보자

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

posted by 모카쨩
2024. 8. 9. 14:57 사용설명서

 

 

 

 

 

 

 

 

 

 

참여설정을 체크한다

탭 이름을 이상하게 지었다

'그룹채팅방 참여시 체크'라고 지으면 좋았을것을

 

 

 

 

 

친구에게만 개인메시지 받기도 체크한다

사진에는 왜인지 게임메세지로 나옴

 

 

 

 

 

 

그리고 친구탭에 들어간다

 

 

 

 

 

 

 

 

친구추천, 전화번호 추가 허용 추가 둘다 해제한다

 

 

모르는 사람이 메신저 막 추가할수 있는건 단점인듯 

'사용설명서' 카테고리의 다른 글

윈10 복구 USB 만드는법  (0) 2024.08.11
주모니터 설정  (0) 2024.07.16
마켓비 벙커침대 조립설명서  (0) 2024.06.23
posted by 모카쨩
2024. 8. 3. 18:48 파이썬

 

 

 

터미널에 설치 명령어 입력

pip install mediapipe opencv-python

 

 

 

 

 

기다린다

 

 

 

 

 

 

 

 

 

import cv2
import mediapipe as mp
import tkinter as tk
from tkinter import ttk

mp_hands = mp.solutions.hands
mp_drawing = mp.solutions.drawing_utils

# 사용할 카메라 선택
def select_camera():
    index = 0
    cameras = []
    while True:
        cap = cv2.VideoCapture(index)
        if not cap.read()[0]:
            break
        else:
            cameras.append(index)
        cap.release()
        index += 1
    return cameras

# 카메라 선택 콜백 함수
def on_select(event):
    global selected_camera
    selected_camera = int(camera_combobox.get())

# 카메라 선택 GUI 생성
def create_gui():
    global camera_combobox
    root = tk.Tk()
    root.title("카메라 선택")

    tk.Label(root, text="사용할 카메라를 선택하세요:").pack(pady=10)

    cameras = select_camera()
    camera_combobox = ttk.Combobox(root, values=cameras)
    camera_combobox.pack(pady=10)
    camera_combobox.bind("<<ComboboxSelected>>", on_select)

    tk.Button(root, text="확인", command=root.quit).pack(pady=10)
    root.mainloop()

# 카메라 선택 GUI 생성 및 실행
selected_camera = None
create_gui()

# 선택된 카메라로 비디오 캡처 시작
cap = cv2.VideoCapture(selected_camera)

with mp_hands.Hands(
        max_num_hands=2,
        min_detection_confidence=0.5,
        min_tracking_confidence=0.5) as hands:
    while cap.isOpened():
        success, image = cap.read()
        if not success:
            print("카메라를 찾을 수 없습니다.")
            break

        # 성능을 위해 이미지를 쓰지 않음 모드로 변환
        image = cv2.cvtColor(cv2.flip(image, 1), cv2.COLOR_BGR2RGB)
        image.flags.writeable = False
        results = hands.process(image)

        # 이미지에 손 주석 그리기
        image.flags.writeable = True
        image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)
        if results.multi_hand_landmarks:
            for hand_landmarks in results.multi_hand_landmarks:
                mp_drawing.draw_landmarks(
                    image, hand_landmarks, mp_hands.HAND_CONNECTIONS)

        # 이미지 출력
        cv2.imshow('MediaPipe Hands', image)
        if cv2.waitKey(5) & 0xFF == 27:
            break

cap.release()
cv2.destroyAllWindows()

 

 

 

 

 

 

결과

https://youtu.be/i4Ttl-PPbTo

 

 

 

 

'파이썬' 카테고리의 다른 글

IDLE 대체 하기  (0) 2024.11.07
파이썬 관련 설치명령어 모음  (0) 2023.05.04
RVC 오류,에러 모음  (0) 2023.04.28
posted by 모카쨩

저사양 유저용 블로그 진입