내가 구현하면서 실수한게
블루프린트에서 사용하던 ScreenX, Y는
C++에서 써야되서
C++에서 먼저 만들어서 가져와써야됫다.
근데 생각못하고 BP에 만들어서 사용
그래서 기존 ScreenX, ScreenY앞에 BP_를 붙여 이름을 구분하고
CameraPawn 헤더에 따로변수추가
윈API 쓸것이므로
헤더 추가
커서 이동, 클릭을 위한 함수도 추가.
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "Windows/AllowWindowsPlatformTypes.h"
#include <Windows.h>
#include "Windows/HideWindowsPlatformTypes.h"
#include <GameFramework/SpringArmComponent.h>
#include <Camera/CameraComponent.h>
#include "Components/PoseableMeshComponent.h"
#include "CoreMinimal.h"
#include "GameFramework/Pawn.h"
#include "CameraPawn.generated.h"
UCLASS()
class HANDDESKTOP_API ACameraPawn : public APawn
{
GENERATED_BODY()
public:
// Sets default values for this pawn's properties
ACameraPawn();
protected:
// Called when the game starts or when spawned
virtual void BeginPlay() override;
public:
// Called every frame
virtual void Tick(float DeltaTime) override;
// Called to bind functionality to input
virtual void SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) override;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = PoseableMesh)
UPoseableMeshComponent* HandRight;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = PoseableMesh)
UPoseableMeshComponent* HandLeft;
UPROPERTY(VisibleAnywhere, Category = Camera)
class USpringArmComponent* springArmComp;
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Camera)
class UCameraComponent* camComp;
UPROPERTY(VisibleAnywhere, BlueprintReadWrite, Category = ScreenCoord)
int ScreenX = 0;
UPROPERTY(VisibleAnywhere, BlueprintReadWrite, Category = ScreenCoord)
int ScreenY = 0;
UFUNCTION(BlueprintCallable, Category=MouseControl)
void MouseMove();
UFUNCTION(BlueprintCallable, Category = MouseControl)
void MouseClick(int status);
};
마우스 무브 구현
void ACameraPawn::MouseMove()
{
SetCursorPos(ScreenX, ScreenY);
}
BP스크린xY계산과 커서 이동 중간에
ScreenXY 설정, 마우스 무브도 추가
마우스 커서 이동 확인
마지막으로 마우스 클릭 구현 차례인데
일단 3이하받으면 마우스 이벤트 수행
아니면 안하고
void ACameraPawn::MouseClick(int status)
{
INPUT input = { 0 };
input.type = INPUT_MOUSE;
if (status == 0)
input.mi.dwFlags = MOUSEEVENTF_LEFTDOWN;
else if(status == 1)
input.mi.dwFlags = MOUSEEVENTF_LEFTUP;
else if(status == 2)
input.mi.dwFlags = MOUSEEVENTF_RIGHTDOWN;
else if(status == 3)
input.mi.dwFlags = MOUSEEVENTF_RIGHTUP;
if (status <= 3)
SendInput(1, &input, sizeof(INPUT));
}
마우스 클릭 이벤트 처리 시점을 생각해봤는데
커서 이동 체크 루틴에서
1. 커서 이동 체크시 아닐 겨우 확인 직후 바로
2. 커서 이동 체크시 이동하는 경우 ScreenXY 설정, 마우스 이동이후 바로
다뤄야 할듯
좌클릭의 경우 오른손 검지 중지 붙였을때
우클릭의경우 오른손 약지 소지를 접었을때로 처리
상태 다루기위한 ClickStatus, ClickStatusPrev int타입으로 추가
위 C++코드대로
0 : 좌마우스 다운
1 : 좌마우스 업
2 : 우마우스 다운
3 : 우마우스 업
4 : None
으로 5가지로 다룸
우선 좌클릭은 커서 이동여부 체크때 썻던 내용 활용
해서 하려고하는데
손 겹침과 마우스 입력 경우가 섞여있어서 햇갈린다.
나눠서 다시정리하자
손가락붙임상태
0 검지중지붙음
1 약지소지접힘
2 아무것도 안됨(디폴트)
마우스입력상태
0 : 좌마우스 다운
1 : 좌마우스 업
2 : 우마우스 다운
3 : 우마우스 업
4 : None(디폴트)
손가락붙임상태의 경우 이전, 현재를 따로 놓고 구분하자
이전 현재 값이 동일한 경우 4로 mouseClick함수 호출해서
SendInput을 안보내려고하는데
좌마우스 다운상태에서 SendInput시 드래그가 되는건진 모르겟다.
손가락붙임상태_이전 | 손가락붙임상태_현재 | 마우스입력상태 |
2(안붙음) | 0(검지중지붙음) | 0(좌마우스다운) |
0(검지중지붙음) | 2(안붙음) | 1(좌마우스업) |
2(안붙음) | 1(약지소지접힘) | 2(우마우스 다운) |
1(약지소지접힘) | 2(안붙음) | 3(우마우스 업) |
이전 현재 동일한경우 | 이전 현재 동일한경우 | 4(None) |
이를 위해 마우스 스테이터스 변수 추가
오른손을보고 손가락붙임 상태 보는 BP
0, 1, 2 구분할수 있도록 만들었다.
그리고 이 표대로 작성 후
마우스 클릭 호출 하는 블루프린트
마우스 클릭 동작은 편의를 위해서 커서 움직이지 않는 경우에만 진입
손가락붙임상태_이전 | 손가락붙임상태_현재 | 마우스입력상태 |
2(안붙음) | 0(검지중지붙음) | 0(좌마우스다운) |
0(검지중지붙음) | 2(안붙음) | 1(좌마우스업) |
2(안붙음) | 1(약지소지접힘) | 2(우마우스 다운) |
1(약지소지접힘) | 2(안붙음) | 3(우마우스 업) |
이전 현재 동일한경우 | 이전 현재 동일한경우 | 4(None) |
결과 영상
'컴퓨터과학 > 언리얼' 카테고리의 다른 글
관성모션 - 1. 이것저것 찾아보기 (0) | 2024.02.13 |
---|---|
VR기초 - 1. 준비 (0) | 2024.02.13 |
HandDesktop25 - 손 제스처로 마우스 커서 이동 구현(+커서 회전) (0) | 2024.02.08 |
HandDesktop24 - 윈API로 간단하게 마우스 다루기 (0) | 2024.02.07 |
HandDesktop23 - 라인트레이싱 결과 화면 좌표 매칭 (0) | 2024.02.07 |