wam
w__am 개발노트
wam
  • 분류 전체보기 (165)
    • CS 지식 (10)
      • 자료구조 (0)
      • 알고리즘 (0)
      • 컴퓨터 구조 (0)
      • 운영체제 (0)
      • 네트워크 (7)
      • 데이터베이스 (0)
      • 디자인 패턴 (3)
    • Frontend (131)
      • Three.js (64)
      • NPM (1)
      • Nest.js (19)
      • React (10)
      • Apollo (7)
      • TypeScript (2)
      • JavaScript (12)
      • HTML, CSS (1)
      • Jest (3)
      • E2E (5)
      • Cypress (7)
    • Database (12)
      • TypeORM (12)
    • IT 지식 (8)
      • 클라우드 서비스 (3)
      • 네트워크 (1)
      • 데이터 포맷 (2)
      • 기타 (2)
    • IT Book (2)
    • 유용한 사이트 (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록
  • 🐱 Github

인기 글

태그

  • e.preventdefault()
  • Decorators
  • 렌더링 성능 최적화
  • math.cos()
  • react 성능 최적화
  • Interface
  • joi 에러
  • mapped types
  • 함수 리터럴
  • math.sin()
  • 원형적인 움직임
  • getelapsedtime()
  • 스코프
  • 디자인 패턴
  • 함수 선언문
  • gridhelper
  • 함수 표현식
  • 초기 환경설정
  • reactive variables
  • 데이터 포맷
  • threejs 개발 할 때 도움을 줄 수 있는 유틸리티
  • 삼각함수
  • 오프-프레미스(off-premise) 방식
  • three.js 구성 요소
  • type-graphql
  • 함수의 범위
  • getdelta()
  • axeshelper
  • API
  • isabstract

최근 글

관리자

글쓰기 / 스킨편집 / 관리자페이지
hELLO · Designed By 정상우.
wam

w__am 개발노트

Raycaster, 드래그 클릭 방지
Frontend/Three.js

Raycaster, 드래그 클릭 방지

2024. 11. 25. 15:45

 

드래그 클릭 방지

  • 드래그 후 마우스를 떼는 순간 클릭됐다 체크된다.
  • 마우스 이벤트를 사용하여 드래그 클릭 방지하기

 

 

처음 위치에서 최소 거리 이상 이동 시 드래그로 간주

function checkIntersects() {
  if (mouseDragMoved) return; // 드래그 시 클릭 이벤트 실행하지 않음

  // 카메라와 마우스 위치를 사용해 Raycaster 업데이트
  raycaster.setFromCamera(mouse, camera);

  // 마우스 위치와 교차하는 객체 확인
  const intersects = raycaster.intersectObjects(meshes);
  for (const item of intersects) {
    console.log("📢 [ex03_preventDragClick.js:85]", item.object.name);

    // 색상이 이미 빨간색인지 확인
    if (item.object.material.color.equals(new THREE.Color("red"))) {
      // 빨간색이면 원래 색상으로 변경
      item.object.material.color.copy(item.object.originalColor);
    } else {
      // 원래 색상이면 빨간색으로 변경
      item.object.material.color.set("red");
    }
    break; // 첫 번째 교차한 객체만 처리
  }
}

// 드래그 클릭 방지
let mouseDragMoved; // 마우스를 드래그 여부 체크
let clickStartX;
let clickStartY;

canvas.addEventListener("mousedown", (e) => {
  // 처음 클릭한 위치 좌표
  clickStartX = e.clientX;
  clickStartY = e.clientY;
});

canvas.addEventListener("mouseup", (e) => {
  // 마우스를 클릭하는 위치와 마우스를 떼는 시점의 위치가 일정 거리 차이가 있다면 드래그 한 것으로 간주
  const xGap = Math.abs(e.clientX - clickStartX);
  const yGap = Math.abs(e.clientY - clickStartY);
	
	const dragThreshold = 5; // 드래그로 간주할 최소 거리
  if (xGap > dragThreshold || yGap > dragThreshold) {
    // 드래그로 간주
    mouseDragMoved = true;
  } else {
    mouseDragMoved = false;
  }
});

위에서 문제점은 드래그로 회전했다 원래 위치로 돌아갔을 경우 최소 이동거리 내로 체크될 경우가 있다. 이는 특정시간으로 체크하여 드래그로 간주해주어야 한다.

 

 

절대값 함수

Math.abs(-5);  // 결과: 5
Math.abs(3);   // 결과: 3

 

 

경과 시간으로 드래그 간주

canvas.addEventListener("mouseup", (e) => {
  // 마우스를 클릭하는 위치와 마우스를 떼는 시점의 위치가 일정 거리 차이가 있다면 드래그 한 것으로 간주
  const xGap = Math.abs(e.clientX - clickStartX);
  const yGap = Math.abs(e.clientY - clickStartY);
  const timeGap = Date.now() - clickStartTime;

  const dragThreshold = 5; // 드래그로 간주할 최소 거리
  const dragThresholdTime = 500; // 드래그로 간주할 최소 시간 (단위: 밀리초) 0.5초
  if (
    xGap > dragThreshold ||
    yGap > dragThreshold ||
    timeGap > dragThresholdTime
  ) {
    // 드래그로 간주
    mouseDragMoved = true;
  } else {
    mouseDragMoved = false;
  }
});

 

 

 

저작자표시 변경금지 (새창열림)

'Frontend > Three.js' 카테고리의 다른 글

[Blender] 다운로드 및 패널 추가/삭제  (0) 2024.11.26
glTF, 3D 모델과 장면을 경량화하고 빠르게 전송·렌더링하기 위한 표준 파일 포맷  (0) 2024.11.26
Raycaster, 클릭한 Mesh 감지하기  (0) 2024.11.14
Raycaster, 특정 방향의 광선(Ray)에 맞은 Mesh 판별하기  (0) 2024.11.12
Raycaster, 동작 원리  (0) 2024.11.12
    'Frontend/Three.js' 카테고리의 다른 글
    • [Blender] 다운로드 및 패널 추가/삭제
    • glTF, 3D 모델과 장면을 경량화하고 빠르게 전송·렌더링하기 위한 표준 파일 포맷
    • Raycaster, 클릭한 Mesh 감지하기
    • Raycaster, 특정 방향의 광선(Ray)에 맞은 Mesh 판별하기
    wam
    wam

    티스토리툴바